On Mon, Aug 17, 2015 at 4:56 PM, Bjorn Helgaas <bhelgaas@xxxxxxxxxx> wrote: > On Mon, Jul 27, 2015 at 04:29:38PM -0700, Yinghai Lu wrote: >> If the bridge does not support hotplug or no child with sriov support >> we could get out early and don't try must+optional allocation. > > You mention non-hotplug bridges and non-SR-IOV devices, but I can't figure > out how the patch itself relates to those. How can I connect them? in setup that does not support hotplug and sriov, then we will not have optional resources. > >> Also in the loop that update res with optional add info, skip resource >> that add_size is 0. >> >> Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> >> --- >> drivers/pci/setup-bus.c | 32 +++++++++++++++++++++++++++++--- >> 1 file changed, 29 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c >> index d1f9e19..64ef516 100644 >> --- a/drivers/pci/setup-bus.c >> +++ b/drivers/pci/setup-bus.c >> @@ -450,6 +450,24 @@ static bool pci_need_to_release(unsigned long mask, struct resource *res) >> return false; /* should not get here */ >> } >> >> +static bool __has_addon(struct list_head *head, >> + struct list_head *realloc_head) > > Why does this have a "__" prefix? Sorry, will remove that. > >> +{ >> + int add_count = 0; >> + struct pci_dev_resource *dev_res, *tmp_res; >> + >> + /* check if we have add really */ >> + list_for_each_entry(dev_res, head, list) { >> + tmp_res = res_to_dev_res(realloc_head, dev_res->res); >> + if (!tmp_res || !tmp_res->add_size) >> + continue; >> + >> + add_count++; >> + } >> + >> + return add_count != 0; >> +} >> + >> static bool save_resources(struct list_head *head, >> struct list_head *save_head) >> { >> @@ -481,16 +499,24 @@ static bool __assign_resources_must_add_sorted(struct list_head *head, >> struct pci_dev_resource *save_res; >> struct pci_dev_resource *dev_res, *tmp_res; >> unsigned long fail_type; >> - resource_size_t add_align; >> + resource_size_t add_align, add_size; >> struct resource *res; >> >> + if (!__has_addon(head, realloc_head)) >> + return false; >> + >> if (!save_resources(head, &save_head)) >> return false; >> >> /* Update res in head list with add_size in realloc_head list */ >> list_for_each_entry(dev_res, head, list) { >> res = dev_res->res; >> - res->end += get_res_add_size(realloc_head, res); >> + add_size = get_res_add_size(realloc_head, res); >> + >> + if (!add_size) >> + continue; >> + >> + res->end += add_size; >> >> /* >> * There are two kinds of additional resources in the list: >> @@ -578,7 +604,7 @@ static void __assign_resources_sorted(struct list_head *head, >> */ >> >> /* Check must+optional add */ >> - if (realloc_head && !list_empty(realloc_head) && >> + if (realloc_head && > > Why are you dropping the !list_empty() test? count in __has_addon() will be 0, so we can skip checking here. > >> __assign_resources_must_add_sorted(head, realloc_head)) >> return; >> >> -- >> 1.8.4.5 >> -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html