x86/PCI: embed pci_sysdata into pci_root_info on ACPI path
authorYinghai Lu <yinghai@kernel.org>
Tue, 3 Apr 2012 01:31:53 +0000 (18:31 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 30 Apr 2012 20:52:43 +0000 (14:52 -0600)
Embed the x86 struct pci_sysdata in the struct pci_root_info so it
will be automatically freed in the remove path.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
arch/x86/pci/acpi.c

index 23e7361..8a17b23 100644 (file)
@@ -13,6 +13,7 @@ struct pci_root_info {
        unsigned int res_num;
        struct resource *res;
        int busnum;
+       struct pci_sysdata sd;
 };
 
 static bool pci_use_crs = true;
@@ -410,26 +411,16 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
        if (node != -1 && !node_online(node))
                node = -1;
 
-       /* Allocate per-root-bus (not per bus) arch-specific data.
-        * TODO: leak; this memory is never freed.
-        * It's arguable whether it's worth the trouble to care.
-        */
-       sd = kzalloc(sizeof(*sd), GFP_KERNEL);
-       if (!sd) {
+       info = kzalloc(sizeof(*info), GFP_KERNEL);
+       if (!info) {
                printk(KERN_WARNING "pci_bus %04x:%02x: "
                       "ignored (out of memory)\n", domain, busnum);
                return NULL;
        }
 
+       sd = &info->sd;
        sd->domain = domain;
        sd->node = node;
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
-       if (!info) {
-               kfree(sd);
-               printk(KERN_WARNING "pci_bus %04x:%02x: "
-                      "ignored (out of memory)\n", domain, busnum);
-               return NULL;
-       }
        /*
         * Maybe the desired pci bus has been already scanned. In such case
         * it is unnecessary to scan the pci bus with the given domain,busnum.
@@ -442,7 +433,6 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
                 */
                memcpy(bus->sysdata, sd, sizeof(*sd));
                kfree(info);
-               kfree(sd);
        } else {
                probe_pci_root_info(info, device, busnum, domain);
 
@@ -484,9 +474,6 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
                }
        }
 
-       if (!bus)
-               kfree(sd);
-
        if (bus && node != -1) {
 #ifdef CONFIG_ACPI_NUMA
                if (pxm >= 0)