Re: [PATCH v5 3/7] PCI: Use pci_walk_bus to detect unassignedresources

From: Bjorn Helgaas
Date: Tue Jun 25 2013 - 17:15:29 EST


On Fri, May 31, 2013 at 11:03:08PM -0700, Yinghai Lu wrote:
> Per Bjorn, use pci_walk_bus instead of for_each_pci_dev or
> calling pci_realloc_detect() recursively, that will make code more readable.
>
> Per Bjorn, separate it from big patch that handing assign_unssigned per root bus.
>
> Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>
>
> ---
> drivers/pci/setup-bus.c | 46 +++++++++++++++++++++++++++++++---------------
> 1 file changed, 31 insertions(+), 15 deletions(-)
>
> Index: linux-2.6/drivers/pci/setup-bus.c
> ===================================================================
> --- linux-2.6.orig/drivers/pci/setup-bus.c
> +++ linux-2.6/drivers/pci/setup-bus.c
> @@ -1427,30 +1427,46 @@ static bool __init pci_realloc_enabled(v
> return pci_realloc_enable >= user_enabled;
> }
>
> -static void __init pci_realloc_detect(void)
> -{
> #if defined(CONFIG_PCI_IOV) && defined(CONFIG_PCI_REALLOC_ENABLE_AUTO)
> - struct pci_dev *dev = NULL;
> +static int __init check_unassigned_resources(struct pci_dev *dev, void *data)

I'm not going to add a function named "check_*()" because the name gives no
clue about what the return value means. If it's a boolean function, the
name should be something like a question that has a yes/no answer.

> +{
> + int i;
> + int *unassigned = data;
>
> - if (pci_realloc_enable != undefined)
> - return;
> + for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) {
> + struct resource *r = &dev->resource[i];
>
> - for_each_pci_dev(dev) {
> - int i;
> + /* Not assigned, or rejected by kernel ? */
> + if (r->flags && !r->start) {
> + (*unassigned)++;
> + return 1; /* return early from pci_walk_bus */
> + }
> + }
>
> - for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) {
> - struct resource *r = &dev->resource[i];
> + return 0;
> +}
>
> - /* Not assigned, or rejected by kernel ? */
> - if (r->flags && !r->start) {
> - pci_realloc_enable = auto_enabled;
> +static void __init pci_realloc_detect(void)
> +{
> + int unassigned = 0;
> + struct pci_bus *bus;
>
> - return;
> - }
> + if (pci_realloc_enable != undefined)
> + return;
> +
> + list_for_each_entry(bus, &pci_root_buses, node) {
> + pci_walk_bus(bus, check_unassigned_resources, &unassigned);
> + if (unassigned) {
> + pci_realloc_enable = auto_enabled;
> + return;
> }
> }
> -#endif
> }
> +#else
> +static void __init pci_realloc_detect(void)
> +{
> +}
> +#endif
>
> /*
> * first try will not touch pci bridge res
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/