| From foo@baz Sun Jun 17 12:07:34 CEST 2018 |
| From: Sebastian Sanchez <sebastian.sanchez@intel.com> |
| Date: Tue, 1 May 2018 05:36:13 -0700 |
| Subject: IB/hfi1: Fix memory leak in exception path in get_irq_affinity() |
| |
| From: Sebastian Sanchez <sebastian.sanchez@intel.com> |
| |
| [ Upstream commit 59482a14918b282ca2a98f38c69da5ebeb1107d2 ] |
| |
| When IRQ affinity is set and the interrupt type is unknown, a cpu |
| mask allocated within the function is never freed. Fix this memory |
| leak by allocating memory within the scope where it is used. |
| |
| Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com> |
| Signed-off-by: Sebastian Sanchez <sebastian.sanchez@intel.com> |
| Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/infiniband/hw/hfi1/affinity.c | 11 +++++------ |
| 1 file changed, 5 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/infiniband/hw/hfi1/affinity.c |
| +++ b/drivers/infiniband/hw/hfi1/affinity.c |
| @@ -412,7 +412,6 @@ static void hfi1_cleanup_sdma_notifier(s |
| static int get_irq_affinity(struct hfi1_devdata *dd, |
| struct hfi1_msix_entry *msix) |
| { |
| - int ret; |
| cpumask_var_t diff; |
| struct hfi1_affinity_node *entry; |
| struct cpu_mask_set *set = NULL; |
| @@ -424,10 +423,6 @@ static int get_irq_affinity(struct hfi1_ |
| extra[0] = '\0'; |
| cpumask_clear(&msix->mask); |
| |
| - ret = zalloc_cpumask_var(&diff, GFP_KERNEL); |
| - if (!ret) |
| - return -ENOMEM; |
| - |
| entry = node_affinity_lookup(dd->node); |
| |
| switch (msix->type) { |
| @@ -458,6 +453,9 @@ static int get_irq_affinity(struct hfi1_ |
| * finds its CPU here. |
| */ |
| if (cpu == -1 && set) { |
| + if (!zalloc_cpumask_var(&diff, GFP_KERNEL)) |
| + return -ENOMEM; |
| + |
| if (cpumask_equal(&set->mask, &set->used)) { |
| /* |
| * We've used up all the CPUs, bump up the generation |
| @@ -469,6 +467,8 @@ static int get_irq_affinity(struct hfi1_ |
| cpumask_andnot(diff, &set->mask, &set->used); |
| cpu = cpumask_first(diff); |
| cpumask_set_cpu(cpu, &set->used); |
| + |
| + free_cpumask_var(diff); |
| } |
| |
| cpumask_set_cpu(cpu, &msix->mask); |
| @@ -482,7 +482,6 @@ static int get_irq_affinity(struct hfi1_ |
| hfi1_setup_sdma_notifier(msix); |
| } |
| |
| - free_cpumask_var(diff); |
| return 0; |
| } |
| |