[PATCH] pci: aspm: free memory from lists
IvanHu
ivan.hu at canonical.com
Thu May 17 10:13:19 UTC 2012
On 05/17/2012 02:12 PM, Keng-Yu Lin wrote:
> 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>
Acked-by: Ivan Hu<ivan.hu at canonical.com>
More information about the fwts-devel
mailing list