• Geert Uytterhoeven's avatar
    PCI: Fix pci_register_io_range() memory leak · f6bda644
    Geert Uytterhoeven authored
    Kmemleak reports:
    
      unreferenced object 0xc328de40 (size 64):
        comm "kworker/1:1", pid 21, jiffies 4294938212 (age 1484.670s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 e0 d8 fc eb 00 00 00 00  ................
          00 00 10 fe 00 00 00 00 00 00 00 00 00 00 00 00  ................
    
      backtrace:
        [<ad758d10>] pci_register_io_range+0x3c/0x80
        [<2c7f139e>] of_pci_range_to_resource+0x48/0xc0
        [<f079ecc8>] devm_of_pci_get_host_bridge_resources.constprop.0+0x2ac/0x3ac
        [<e999753b>] devm_of_pci_bridge_init+0x60/0x1b8
        [<a895b229>] devm_pci_alloc_host_bridge+0x54/0x64
        [<e451ddb0>] rcar_pcie_probe+0x2c/0x644
    
    In case a PCI host driver's probe is deferred, the same I/O range may be
    allocated again, and be ignored, causing a memory leak.
    
    Fix this by (a) letting logic_pio_register_range() return -EEXIST if the
    passed range already exists, so pci_register_io_range() will free it, and
    by (b) making pci_register_io_range() not consider -EEXIST an error
    condition.
    
    Link: https://lore.kernel.org/r/20210202100332.829047-1-geert+renesas@glider.beSigned-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    f6bda644
pci.c 174 KB