[PATCH] pci: aspm: free memory from lists
Alex Hung
alex.hung at canonical.com
Wed May 16 02:46:12 UTC 2012
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>
More information about the fwts-devel
mailing list