staging/rdma/hfi1: Fix memory leaks
authorJubin John <jubin.john@intel.com>
Fri, 26 Feb 2016 21:33:33 +0000 (13:33 -0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 11 Mar 2016 01:45:47 +0000 (20:45 -0500)
Fix 3 memory leaks reported by the LeakCheck tool in the KEDR framework.

The following resources were allocated memory during their respective
initializations but not freed during cleanup:
1. SDMA map elements
2. PIO map elements
3. HW send context to SW index map

This patch fixes the memory leaks by freeing the allocated memory in the
cleanup path.

Reviewed-by: Dean Luick <dean.luick@intel.com>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Jubin John <jubin.john@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/staging/rdma/hfi1/init.c
drivers/staging/rdma/hfi1/pio.c
drivers/staging/rdma/hfi1/sdma.c

index 371ed293677d25f4ec4b32cfbfc34cfc6af9d9f9..37b3ce8377b6bd768a26db3283d38337e11230ef 100644 (file)
@@ -1324,6 +1324,8 @@ static void cleanup_device_data(struct hfi1_devdata *dd)
        dd->num_send_contexts = 0;
        kfree(dd->send_contexts);
        dd->send_contexts = NULL;
+       kfree(dd->hw_to_sw);
+       dd->hw_to_sw = NULL;
        kfree(dd->boardname);
        vfree(dd->events);
        vfree(dd->status);
index 859cb460154764b0b43316bd9d57829cab9ba4ce..361b43d47c76c5a8152f539dd99cf6052903fa72 100644 (file)
@@ -1881,7 +1881,7 @@ void free_pio_map(struct hfi1_devdata *dd)
        /* Free PIO map if allocated */
        if (rcu_access_pointer(dd->pio_map)) {
                spin_lock_irq(&dd->pio_map_lock);
-               kfree(rcu_access_pointer(dd->pio_map));
+               pio_map_free(rcu_access_pointer(dd->pio_map));
                RCU_INIT_POINTER(dd->pio_map, NULL);
                spin_unlock_irq(&dd->pio_map_lock);
                synchronize_rcu();
index e29b5d394a5f156765912d19952a32902c985842..abb8ebc1fcac9060032e6accc74df34645f2276d 100644 (file)
@@ -966,7 +966,7 @@ static void sdma_clean(struct hfi1_devdata *dd, size_t num_engines)
                sde->tx_ring = NULL;
        }
        spin_lock_irq(&dd->sde_map_lock);
-       kfree(rcu_access_pointer(dd->sdma_map));
+       sdma_map_free(rcu_access_pointer(dd->sdma_map));
        RCU_INIT_POINTER(dd->sdma_map, NULL);
        spin_unlock_irq(&dd->sde_map_lock);
        synchronize_rcu();