Skip to content

Commit

Permalink
PCI: Look for unassigned resources on per-bus basis
Browse files Browse the repository at this point in the history
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: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
  • Loading branch information
Yinghai Lu authored and Bjorn Helgaas committed Jul 25, 2013
1 parent 61e83cd commit 223d96f
Showing 1 changed file with 29 additions and 15 deletions.
44 changes: 29 additions & 15 deletions drivers/pci/setup-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -1359,30 +1359,44 @@ static bool __init pci_realloc_enabled(void)
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 iov_resources_unassigned(struct pci_dev *dev, void *data)
{
int i;
bool *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 = true;
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)
{
bool unassigned = false;
struct pci_bus *bus;

return;
}
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;
}
}
#endif
}
#else
static void __init pci_realloc_detect(void) { }
#endif

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

0 comments on commit 223d96f

Please sign in to comment.