[PATCH] pci: aspm: free memory from lists

Keng-Yu Lin kengyu at canonical.com
Thu May 17 06:12:31 UTC 2012


On Wed, May 16, 2012 at 10:46 AM, Alex Hung <alex.hung at canonical.com> wrote:
> On 05/16/2012 03:02 AM, Colin King wrote:
>>
>> From: Colin Ian King<colin.king at canonical.com>
>>
>> free lspci text lists and pci device lists correctly. valgrind
>> found a bunch of memory allocations that were not being freed.
>>
>> Signed-off-by: Colin Ian King<colin.king at canonical.com>
>> ---
>>  src/pci/aspm/aspm.c |   32 ++++++++++++++++++++++----------
>>  1 file changed, 22 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/pci/aspm/aspm.c b/src/pci/aspm/aspm.c
>> index c461ce8..fe6cb60 100644
>> --- a/src/pci/aspm/aspm.c
>> +++ b/src/pci/aspm/aspm.c
>> @@ -188,6 +188,17 @@ int pcie_compare_rp_dev_aspm_registers(fwts_framework
>> *fw,
>>        return ret;
>>  }
>>
>> +static void pci_device_list_free(struct pci_device *head)
>> +{
>> +       struct pci_device *next;
>> +
>> +       while (head) {
>> +               next = head->next;
>> +               free(head);
>> +               head = next;
>> +       }
>> +}
>> +
>>  int pcie_check_aspm_registers(fwts_framework *fw,
>>                                   const fwts_log_level level)
>>  {
>> @@ -212,8 +223,11 @@ int pcie_check_aspm_registers(fwts_framework *fw,
>>                char *pEnd;
>>
>>                device = (struct pci_device *) calloc(1, sizeof(*device));
>> -               if (device == NULL)
>> +               if (device == NULL) {
>> +                       pci_device_list_free(head);
>> +                       fwts_text_list_free(lspci_output);
>>                        return FWTS_ERROR;
>> +               }
>>
>>                device->bus = strtol(line,&pEnd, 16);
>>                device->dev = strtol(pEnd + 1,&pEnd, 16);
>>
>> @@ -226,6 +240,7 @@ int pcie_check_aspm_registers(fwts_framework *fw,
>>
>>                cur = device;
>>        }
>> +       fwts_text_list_free(lspci_output);
>>
>>        for (cur = head; cur; cur = cur->next) {
>>                int reg_loc = 0, reg_val = 0;
>> @@ -235,10 +250,13 @@ int pcie_check_aspm_registers(fwts_framework *fw,
>>                        fw->lspci, cur->bus, cur->dev, cur->func);
>>                if (fwts_pipe_exec(command,&lspci_output) ==
>> FWTS_EXEC_ERROR) {
>>
>>                        fwts_log_warning(fw, "Could not execute %s",
>> command);
>> +                       pci_device_list_free(head);
>>                        return FWTS_ERROR;
>>                }
>> -               if (lspci_output == NULL)
>> +               if (lspci_output == NULL) {
>> +                       pci_device_list_free(head);
>>                        return FWTS_ERROR;
>> +               }
>>
>>                fwts_list_foreach(item, lspci_output) {
>>                        char *line = fwts_text_list_text(item);
>> @@ -253,6 +271,7 @@ int pcie_check_aspm_registers(fwts_framework *fw,
>>                                }
>>                        }
>>                }
>> +               fwts_text_list_free(lspci_output);
>>        }
>>
>>        /* Check aspm registers from the list of pci devices */
>> @@ -275,14 +294,7 @@ int pcie_check_aspm_registers(fwts_framework *fw,
>>                }
>>        }
>>
>> -       cur = head;
>> -       while (cur != NULL) {
>> -               device = cur->next;
>> -               free(cur);
>> -               cur = device;
>> -       }
>> -
>> -       fwts_text_list_free(lspci_output);
>> +       pci_device_list_free(head);
>>
>>        return ret;
>>  }
>
>
> Acked-by: Alex Hung <alex.hung at canonical.com>
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>


More information about the fwts-devel mailing list