[ovs-dev,v3,1/3] netdev-dpdk: Fix dpdk_mp leak in case of EEXIST.

Message ID 1510326972-26479-2-git-send-email-i.maximets@samsung.com
State Accepted
Headers show
  • netdev-dpdk: mempool management: Leaks & Refactoring.
Related show

Commit Message

Ilya Maximets Nov. 10, 2017, 3:16 p.m.
In case of EEXIST, 'dpdk_mp_create()' will allocate yet another
'struct dpdk_mp' with same 'mp' pointer inside. We need to free
this structure to avoid the leak.

CC: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>
CC: Antonio Fischetti <antonio.fischetti@intel.com>
Fixes: d555d9bded5f ("netdev-dpdk: Create separate memory pool for each port.")
Fixes: b6b26021d2e2 ("netdev-dpdk: fix management of pre-existing mempools.")
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Acked-by: Antonio Fischetti <antonio.fischetti@intel.com>
 lib/netdev-dpdk.c | 6 ++++++
 1 file changed, 6 insertions(+)


diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 76e79be..ad52a03 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -659,6 +659,12 @@  netdev_dpdk_mempool_configure(struct netdev_dpdk *dev)
          * Update dev with the new values. */
         dev->mtu = dev->requested_mtu;
         dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
+        /* 'mp' should contain pointer to the mempool already owned by netdev.
+         * Otherwise something went completely wrong. */
+        ovs_assert(dev->dpdk_mp);
+        ovs_assert(dev->dpdk_mp->mp == mp->mp);
+        /* Free the returned struct dpdk_mp because it will not be used. */
+        rte_free(mp);
         return EEXIST;
     } else {
         /* A new mempool was created, release the previous one. */