On Thu, Mar 15, 2012 at 1:39 AM, Taku Izumi <izumi.taku@xxxxxxxxxxxxxx> wrote: > > >> -----Original Message----- >> From: linux-pci-owner@xxxxxxxxxxxxxxx [mailto:linux-pci-owner@xxxxxxxxxxxxxxx] On Behalf Of Yinghai Lu >> Sent: Thursday, March 01, 2012 12:00 PM >> To: Jesse Barnes; Benjamin Herrenschmidt; Tony Luck; David Miller; x86 >> Cc: Bjorn Helgaas; Dominik Brodowski; linux-pci@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; >> linux-arch@xxxxxxxxxxxxxxx; Yinghai Lu >> Subject: [PATCH 02/36] x86, PCI: Fix memleak with get_current_resources >> >> in pci_scan_acpi_root, when pci_use_crs is set, get_current_resources is used >> to get pci_root_info, and it will allocate name and res array. >> >> later if pci_create_root_bus can not create bus (could be already there...) >> it will only free bus res list. but the name and res array is not freed. >> >> let get_current_resource take info pointer instead have local info. >> >> Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> >> --- >> arch/x86/pci/acpi.c | 49 ++++++++++++++++++++++++++++++------------------- >> 1 files changed, 30 insertions(+), 19 deletions(-) >> >> diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c >> index 7cc0a44..304ccf0 100644 >> --- a/arch/x86/pci/acpi.c >> +++ b/arch/x86/pci/acpi.c >> @@ -305,49 +305,55 @@ static void add_resources(struct pci_root_info *info) >> } >> } >> >> +static void free_pci_root_info(struct pci_root_info *info) >> +{ >> + kfree(info->name); >> + kfree(info->res); >> + memset(info, 0, sizeof(struct pci_root_info)); >> +} >> + > > This function leads to misunderstanding. > I'm convinced that the function of the name starts with "free" > should free resources completely. after patchset it will become: static void free_pci_root_info_res(struct pci_root_info *info) { kfree(info->res); info->res = NULL; info->res_num = 0; } static void __release_pci_root_info(struct pci_root_info *info) { int i; struct resource *res; for (i = 0; i < info->res_num; i++) { res = &info->res[i]; if (!res->parent) continue; if (!(res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) continue; release_resource(res); } free_pci_root_info_res(info); kfree(info); } static void release_pci_root_info(struct pci_host_bridge *bridge) { struct pci_root_info *info = bridge->release_data; __release_pci_root_info(info); } Is that still confusing? Thanks Yinghai -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html