Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 223d96fc authored by Yinghai Lu's avatar Yinghai Lu Committed by Bjorn Helgaas
Browse files

PCI: Look for unassigned resources on per-bus basis



When CONFIG_PCI_REALLOC_ENABLE_AUTO=y, pci_realloc_detect() looks at PCI
devices to see if any have SR-IOV resources that need to be assigned.  If
it finds any, it turns on automatic resource reallocation.

This patch changes pci_realloc_detect() so it uses pci_walk_bus() on
each root bus instead of using for_each_pci_dev().  This is a step
toward doing reallocation on a per-bus basis, so we can do it for
a hot-added host bridge.

[bhelgaas: changelog, rename callback to iov_resources_unassigned(), use
boolean for "unassigned"]
Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 61e83cdd
Loading
Loading
Loading
Loading
+29 −15
Original line number Original line Diff line number Diff line
@@ -1359,30 +1359,44 @@ static bool __init pci_realloc_enabled(void)
	return pci_realloc_enable >= user_enabled;
	return pci_realloc_enable >= user_enabled;
}
}


static void __init pci_realloc_detect(void)
{
#if defined(CONFIG_PCI_IOV) && defined(CONFIG_PCI_REALLOC_ENABLE_AUTO)
#if defined(CONFIG_PCI_IOV) && defined(CONFIG_PCI_REALLOC_ENABLE_AUTO)
	struct pci_dev *dev = NULL;
static int __init iov_resources_unassigned(struct pci_dev *dev, void *data)

{
	if (pci_realloc_enable != undefined)
		return;

	for_each_pci_dev(dev) {
	int i;
	int i;
	bool *unassigned = data;


	for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) {
	for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) {
		struct resource *r = &dev->resource[i];
		struct resource *r = &dev->resource[i];


			/* Not assigned, or rejected by kernel ? */
		/* Not assigned or rejected by kernel? */
		if (r->flags && !r->start) {
		if (r->flags && !r->start) {
				pci_realloc_enable = auto_enabled;
			*unassigned = true;
			return 1; /* return early from pci_walk_bus() */
		}
	}


	return 0;
}

static void  __init pci_realloc_detect(void)
{
	bool unassigned = false;
	struct pci_bus *bus;

	if (pci_realloc_enable != undefined)
		return;

	list_for_each_entry(bus, &pci_root_buses, node) {
		pci_walk_bus(bus, iov_resources_unassigned, &unassigned);
		if (unassigned) {
			pci_realloc_enable = auto_enabled;
			return;
			return;
		}
		}
	}
	}
}
}
#else
static void __init pci_realloc_detect(void) { }
#endif
#endif
}


/*
/*
 * first try will not touch pci bridge res
 * first try will not touch pci bridge res