Re: [PATCH 02/36] x86, PCI: Fix memleak with get_current_resources

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux