Messages in this thread Patch in this message | | | From | Yinghai Lu <> | Subject | [PATCH 10/23] PCI, x86: Fix non acpi path pci_sysdata leaking with release_fn | Date | Mon, 5 Mar 2012 23:13:47 -0800 |
| |
non acpi path, or root is not probed from acpi, during root bus removal will get warning about leaking from pci_scan_bus_on_node.
Fix it with setting pci_host_bridge release function.
Signed-off-by: Yinghai Lu <yinghai@kernel.org> --- arch/x86/pci/common.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 8e04ec5..35931f6 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -618,17 +618,19 @@ int pci_ext_cfg_avail(struct pci_dev *dev) return 0; } +static void release_pci_sysdata(struct pci_host_bridge *bridge) +{ + struct pci_sysdata *sd = bridge->release_data; + + kfree(sd); +} + struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node) { LIST_HEAD(resources); struct pci_bus *bus = NULL; struct pci_sysdata *sd; - /* - * 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) { printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busno); @@ -638,7 +640,10 @@ struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, x86_pci_root_bus_resources(busno, &resources); printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busno); bus = pci_scan_root_bus(NULL, busno, ops, sd, &resources); - if (!bus) { + if (bus) + pci_set_host_bridge_release(to_pci_host_bridge(bus->bridge), + release_pci_sysdata, sd); + else { pci_free_resource_list(&resources); kfree(sd); } -- 1.7.7
| |