From 912be9daf41c0a5d1042ccde5581492a43865f32 Mon Sep 17 00:00:00 2001 From: Sagar Abhang Date: Thu, 6 Apr 2017 17:26:37 -0700 Subject: [PATCH] net/vhost: stop dev in close and address mem leak Move the call to stop the device inside the close routine because close needs to stop the device if it isn't stopped. Free the allocated queue buffers in close instead of doing so in remove. Original code had these clean ups in remove which was causing memory leak. Signed-off-by: Sagar Abhang Acked-by: Yuanhan Liu --- drivers/net/vhost/rte_eth_vhost.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 9663e55f0e..257bf6d697 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -792,11 +792,14 @@ eth_dev_close(struct rte_eth_dev *dev) { struct pmd_internal *internal; struct internal_list *list; + unsigned int i; internal = dev->data->dev_private; if (!internal) return; + eth_dev_stop(dev); + rte_vhost_driver_unregister(internal->iface_name); list = find_internal_resource(internal->iface_name); @@ -808,9 +811,17 @@ eth_dev_close(struct rte_eth_dev *dev) pthread_mutex_unlock(&internal_list_lock); rte_free(list); + for (i = 0; i < dev->data->nb_rx_queues; i++) + rte_free(dev->data->rx_queues[i]); + for (i = 0; i < dev->data->nb_tx_queues; i++) + rte_free(dev->data->tx_queues[i]); + + rte_free(dev->data->mac_addrs); free(internal->dev_name); free(internal->iface_name); rte_free(internal); + + dev->data->dev_private = NULL; } static int @@ -1199,7 +1210,6 @@ rte_pmd_vhost_remove(struct rte_vdev_device *dev) { const char *name; struct rte_eth_dev *eth_dev = NULL; - unsigned int i; name = rte_vdev_device_name(dev); RTE_LOG(INFO, PMD, "Un-Initializing pmd_vhost for %s\n", name); @@ -1209,19 +1219,11 @@ rte_pmd_vhost_remove(struct rte_vdev_device *dev) if (eth_dev == NULL) return -ENODEV; - eth_dev_stop(eth_dev); - eth_dev_close(eth_dev); rte_free(vring_states[eth_dev->data->port_id]); vring_states[eth_dev->data->port_id] = NULL; - for (i = 0; i < eth_dev->data->nb_rx_queues; i++) - rte_free(eth_dev->data->rx_queues[i]); - for (i = 0; i < eth_dev->data->nb_tx_queues; i++) - rte_free(eth_dev->data->tx_queues[i]); - - rte_free(eth_dev->data->mac_addrs); rte_free(eth_dev->data); rte_eth_dev_release_port(eth_dev); -- 2.20.1