Skip to contentSkip to conversation

PCI: fix memleak when ACPI _CRS is not used.

PATCH Applied Yinghai Lu 3 participants 3 messages Feb 21, 2012 – Feb 23, 2012

Subsystems (3)
lore
Share & tools
lore

Yinghai Lu

author
#0 lore raw

PATCH 1/1 PCI: fix memleak when ACPI _CRS is not used.

got warning:
unreferenced object 0xffff8801f6914200 (size 512):
comm "swapper/0", pid 1, jiffies 4294893643 (age 2664.644s) hex dump (first 32 bytes):

    00 00 c0 fe 00 00 00 00 ff ff ff ff 00 00 00 00  ................
    60 58 2f f6 03 88 ff ff 00 02 00 00 00 00 00 00  `X/.............
  backtrace:
    [<ffffffff81c2408c>] kmemleak_alloc+0x26/0x43
    [<ffffffff8113764f>] __kmalloc+0x121/0x183
    [<ffffffff81ca8d93>] get_current_resources+0x5a/0xc6
    [<ffffffff81c5bedd>] pci_acpi_scan_root+0x13c/0x21c
    [<ffffffff81c2a745>] acpi_pci_root_add+0x1e1/0x421
    [<ffffffff81408f50>] acpi_device_probe+0x50/0x190
    [<ffffffff8149edc7>] really_probe+0x99/0x126
    [<ffffffff8149ef83>] driver_probe_device+0x3b/0x56
    [<ffffffff8149effd>] __driver_attach+0x5f/0x82
    [<ffffffff8149d860>] bus_for_each_dev+0x5c/0x88
    [<ffffffff8149eb87>] driver_attach+0x1e/0x20
    [<ffffffff8149e7cc>] bus_add_driver+0xca/0x21d
    [<ffffffff8149f47b>] driver_register+0x91/0xfe
    [<ffffffff81409d09>] acpi_bus_register_driver+0x43/0x45
    [<ffffffff8278bdc9>] acpi_pci_root_init+0x20/0x28
    [<ffffffff810001e7>] do_one_initcall+0x57/0x134

The system have _CRS for root buses, but they are not used because is old...

Try free those not used resource array and name.

---
 arch/x86/pci/acpi.c |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
arch/x86/pci/acpi.c +7 -5
Index: linux-2.6/arch/x86/pci/acpi.c
===================================================================
@@ -282,9 +282,6 @@ static void add_resources(struct pci_roo
 	int i;
 	struct resource *res, *root, *conflict;
 
-	if (!pci_use_crs)
-		return;
-
 	coalesce_windows(info, IORESOURCE_MEM);
 	coalesce_windows(info, IORESOURCE_IO);
 
@@ -336,8 +333,13 @@ get_current_resources(struct acpi_device
 	acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,
 				&info);
 
-	add_resources(&info);
-	return;
+	if (pci_use_crs) {
+		add_resources(&info);
+
+		return;
+	}
+
+	kfree(info.name);
 
 name_alloc_fail:
 	kfree(info.res);
maintainer Reviewed-by on v1 1/1
#1 lore raw
Quoted 24 lines · Yinghai Lu

got warning:
unreferenced object 0xffff8801f6914200 (size 512):
 comm "swapper/0", pid 1, jiffies 4294893643 (age 2664.644s) hex dump (first 32 bytes):
   00 00 c0 fe 00 00 00 00 ff ff ff ff 00 00 00 00  ................ 60 58 2f f6 03 88 ff ff 00 02 00 00 00 00 00 00  `X/............. backtrace:

   [<ffffffff81c2408c>] kmemleak_alloc+0x26/0x43
   [<ffffffff8113764f>] __kmalloc+0x121/0x183
   [<ffffffff81ca8d93>] get_current_resources+0x5a/0xc6
   [<ffffffff81c5bedd>] pci_acpi_scan_root+0x13c/0x21c
   [<ffffffff81c2a745>] acpi_pci_root_add+0x1e1/0x421
   [<ffffffff81408f50>] acpi_device_probe+0x50/0x190
   [<ffffffff8149edc7>] really_probe+0x99/0x126
   [<ffffffff8149ef83>] driver_probe_device+0x3b/0x56
   [<ffffffff8149effd>] __driver_attach+0x5f/0x82
   [<ffffffff8149d860>] bus_for_each_dev+0x5c/0x88
   [<ffffffff8149eb87>] driver_attach+0x1e/0x20
   [<ffffffff8149e7cc>] bus_add_driver+0xca/0x21d
   [<ffffffff8149f47b>] driver_register+0x91/0xfe
   [<ffffffff81409d09>] acpi_bus_register_driver+0x43/0x45
   [<ffffffff8278bdc9>] acpi_pci_root_init+0x20/0x28
   [<ffffffff810001e7>] do_one_initcall+0x57/0x134
Quoted 3 lines

The system have _CRS for root buses, but they are not used because is old...

Try free those not used resource array and name.

Thanks for fixing this.

Quoted 40 lines

---
 arch/x86/pci/acpi.c |   12 +++++++-----

 1 file changed, 7 insertions(+), 5 deletions(-)

Index: linux-2.6/arch/x86/pci/acpi.c
===================================================================

arch/x86/pci/acpi.c +7 -5
@@ -282,9 +282,6 @@ static void add_resources(struct pci_roo
        int i;
        struct resource *res, *root, *conflict;
 
-       if (!pci_use_crs)
-               return;
-
        coalesce_windows(info, IORESOURCE_MEM);
        coalesce_windows(info, IORESOURCE_IO);
 
@@ -336,8 +333,13 @@ get_current_resources(struct acpi_device
        acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,
                                &info);
 
-       add_resources(&info);
-       return;
+       if (pci_use_crs) {
+               add_resources(&info);
+
+               return;
+       }
+
+       kfree(info.name);
 

 name_alloc_fail:
       kfree(info.res);
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Applied
#2 lore raw
In reply to Yinghai Lu
Quoted 24 lines · On Mon, 20 Feb 2012 17:23:47 -0800 Yinghai Lu <[email protected]> wrote:

got warning:
unreferenced object 0xffff8801f6914200 (size 512):
comm "swapper/0", pid 1, jiffies 4294893643 (age 2664.644s) hex dump (first 32 bytes):

    00 00 c0 fe 00 00 00 00 ff ff ff ff 00 00 00 00  ................
    60 58 2f f6 03 88 ff ff 00 02 00 00 00 00 00 00  `X/.............
  backtrace:
    [<ffffffff81c2408c>] kmemleak_alloc+0x26/0x43
    [<ffffffff8113764f>] __kmalloc+0x121/0x183
    [<ffffffff81ca8d93>] get_current_resources+0x5a/0xc6
    [<ffffffff81c5bedd>] pci_acpi_scan_root+0x13c/0x21c
    [<ffffffff81c2a745>] acpi_pci_root_add+0x1e1/0x421
    [<ffffffff81408f50>] acpi_device_probe+0x50/0x190
    [<ffffffff8149edc7>] really_probe+0x99/0x126
    [<ffffffff8149ef83>] driver_probe_device+0x3b/0x56
    [<ffffffff8149effd>] __driver_attach+0x5f/0x82
    [<ffffffff8149d860>] bus_for_each_dev+0x5c/0x88
    [<ffffffff8149eb87>] driver_attach+0x1e/0x20
    [<ffffffff8149e7cc>] bus_add_driver+0xca/0x21d
    [<ffffffff8149f47b>] driver_register+0x91/0xfe
    [<ffffffff81409d09>] acpi_bus_register_driver+0x43/0x45
    [<ffffffff8278bdc9>] acpi_pci_root_init+0x20/0x28
    [<ffffffff810001e7>] do_one_initcall+0x57/0x134
Quoted 5 lines

The system have _CRS for root buses, but they are not used because is old...

Try free those not used resource array and name.

Applied to for-linus, thanks.

Signature · 1 line
Jesse Barnes, Intel Open Source Technology Center