]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: Consolidate add_list (aka realloc_head) empty sanity checks
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Wed, 29 Apr 2026 12:26:09 +0000 (15:26 +0300)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 23 Jun 2026 17:08:21 +0000 (12:08 -0500)
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 consistently everywhere.

As __pci_bus_assign_resources() is a 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>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://patch.msgid.link/20260429122617.7324-4-ilpo.jarvinen@linux.intel.com
drivers/pci/setup-bus.c

index 3765693e95f0ba144d0974f8b5c6eec24f705ee8..1e0e28efe8b8ffc59f1d51078251dc12cdbf04d6 100644 (file)
@@ -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);