[PATCH 03/11] PCI: Consolidate add_list (aka realloc_head) empty sanity checks

Ilpo Järvinen
2026-04-29T12:27:01Z

Callers of __pci_bridge_assign_resources() and
__pci_bus_assign_resources() perform
WARN_ON_ONCE(list_empty(add_list))) checks to sanity check that all
optional sizes were processed (and removed) from the list. The empty
list sanity check is duplicated code so the more appropriate place for
it would be inside the called function.

Placing the empty list check into __pci_bus_assign_resources() also
ensures all callsites do perform the sanity check which currently is
not the case when being called from enable_slot(). This inconsistency
was noted by Sashiko though only inside its in depth log but not
flagged as a real problem, possibly because this is only a sanity check
that should never fire. Nonetheless, this sanity check has been very
useful to catch problems early in the past so it's good to do it
consistenty everywhere.

As __pci_bus_assign_resources() is recursive function, it needs to be
renamed to __pci_bus_assign_resources_one() to only perform the empty
list check at the end of processing the entire hierarchy in
__pci_bus_assign_resources().

Suggested-by: sashiko.dev # Sanity check missing from enable_slot()
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/setup-bus.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 3765693e95f0..1e0e28efe8b8 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -1501,9 +1501,9 @@ static void pdev_assign_fixed_resources(struct pci_dev *dev)
}
}

-void __pci_bus_assign_resources(const struct pci_bus *bus,
- struct list_head *add_list,
- struct list_head *fail_head)
+static void __pci_bus_assign_resources_one(const struct pci_bus *bus,
+ struct list_head *add_list,
+ struct list_head *fail_head)
{
struct pci_bus *b;
struct pci_dev *dev;
@@ -1517,7 +1517,7 @@ void __pci_bus_assign_resources(const struct pci_bus *bus,
if (!b)
continue;

- __pci_bus_assign_resources(b, add_list, fail_head);
+ __pci_bus_assign_resources_one(b, add_list, fail_head);

switch (dev->hdr_type) {
case PCI_HEADER_TYPE_BRIDGE:
@@ -1537,6 +1537,16 @@ void __pci_bus_assign_resources(const struct pci_bus *bus,
}
}

+void __pci_bus_assign_resources(const struct pci_bus *bus,
+ struct list_head *add_list,
+ struct list_head *fail_head)
+{
+ __pci_bus_assign_resources_one(bus, add_list, fail_head);
+
+ if (WARN_ON_ONCE(add_list && !list_empty(add_list)))
+ pci_dev_res_free_list(add_list);
+}
+
void pci_bus_assign_resources(const struct pci_bus *bus)
{
__pci_bus_assign_resources(bus, NULL, NULL);
@@ -1641,6 +1651,9 @@ static void __pci_bridge_assign_resources(const struct pci_dev *bridge,
pci_domain_nr(b), b->number);
break;
}
+
+ if (WARN_ON_ONCE(add_list && !list_empty(add_list)))
+ pci_dev_res_free_list(add_list);
}

static void pci_bridge_release_resources(struct pci_bus *bus,
@@ -2205,8 +2218,6 @@ void pci_assign_unassigned_root_bus_resources(struct pci_bus *bus)

/* Depth last, allocate resources and update the hardware. */
__pci_bus_assign_resources(bus, add_list, &fail_head);
- if (WARN_ON_ONCE(add_list && !list_empty(add_list)))
- pci_dev_res_free_list(add_list);
tried_times++;

/* Any device complain? */
@@ -2268,8 +2279,6 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
pci_bridge_distribute_available_resources(bridge, &add_list);

__pci_bridge_assign_resources(bridge, &add_list, &fail_head);
- if (WARN_ON_ONCE(!list_empty(&add_list)))
- pci_dev_res_free_list(&add_list);
tried_times++;

if (list_empty(&fail_head))
@@ -2339,8 +2348,6 @@ static int pbus_reassign_bridge_resources(struct pci_bus *bus, struct resource *

__pci_bus_size_bridges(bridge->subordinate, &add_list);
__pci_bridge_assign_resources(bridge, &add_list, &failed);
- if (WARN_ON_ONCE(!list_empty(&add_list)))
- pci_dev_res_free_list(&add_list);

if (!list_empty(&failed)) {
if (pci_required_resource_failed(&failed, type))
@@ -2473,7 +2480,5 @@ void pci_assign_unassigned_bus_resources(struct pci_bus *bus)
__pci_bus_size_bridges(dev->subordinate, &add_list);
up_read(&pci_bus_sem);
__pci_bus_assign_resources(bus, &add_list, NULL);
- if (WARN_ON_ONCE(!list_empty(&add_list)))
- pci_dev_res_free_list(&add_list);
}
EXPORT_SYMBOL_GPL(pci_assign_unassigned_bus_resources);
--
2.39.5