Thanks, I simplified it slightly and applied this to master and branch-2.6 2016-09-05 6:36 GMT-07:00 Ilya Maximets <i.maxim...@samsung.com>:
> 'dmp' should be freed on failure and on put. > > Fixes: 8a9562d21a40 ("dpif-netdev: Add DPDK netdev.") > Fixes: 8d38823bdf8b ("netdev-dpdk: fix memory leak") > Signed-off-by: Ilya Maximets <i.maxim...@samsung.com> > --- > lib/netdev-dpdk.c | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index 6d334db..f7a6f82 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -474,7 +474,7 @@ dpdk_mp_get(int socket_id, int mtu) > OVS_REQUIRES(dpdk_mutex) > LIST_FOR_EACH (dmp, list_node, &dpdk_mp_list) { > if (dmp->socket_id == socket_id && dmp->mtu == mtu) { > dmp->refcount++; > - return dmp; > + goto out; > } > } > > @@ -499,7 +499,7 @@ dpdk_mp_get(int socket_id, int mtu) > OVS_REQUIRES(dpdk_mutex) > do { > if (snprintf(mp_name, RTE_MEMPOOL_NAMESIZE, "ovs_mp_%d_%d_%u", > dmp->mtu, dmp->socket_id, mp_size) < 0) { > - return NULL; > + goto fail; > } > > dmp->mp = rte_mempool_create(mp_name, mp_size, MBUF_SIZE(mtu), > @@ -511,12 +511,18 @@ dpdk_mp_get(int socket_id, int mtu) > OVS_REQUIRES(dpdk_mutex) > } while (!dmp->mp && rte_errno == ENOMEM && (mp_size /= 2) >= > MIN_NB_MBUF); > > if (dmp->mp == NULL) { > - return NULL; > + goto fail; > } else { > VLOG_DBG("Allocated \"%s\" mempool with %u mbufs", mp_name, > mp_size ); > } > > ovs_list_push_back(&dpdk_mp_list, &dmp->list_node); > + goto out; > + > +fail: > + rte_free(dmp); > + dmp = NULL; > +out: > return dmp; > } > > @@ -532,6 +538,7 @@ dpdk_mp_put(struct dpdk_mp *dmp) > OVS_REQUIRES(dpdk_mutex) > if (!--dmp->refcount) { > ovs_list_remove(&dmp->list_node); > rte_mempool_free(dmp->mp); > + rte_free(dmp); > } > } > > -- > 2.7.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev