From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-000f0801.pphosted.com (mx0a-000f0801.pphosted.com [67.231.144.122]) by dpdk.org (Postfix) with ESMTP id 933C72B91 for ; Sat, 1 Apr 2017 00:50:52 +0200 (CEST) Received: from pps.filterd (m0048193.ppops.net [127.0.0.1]) by mx0a-000f0801.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v2VMhQ98004636; Fri, 31 Mar 2017 15:50:51 -0700 Received: from hq1wp-exmb12.corp.brocade.com ([144.49.131.13]) by mx0a-000f0801.pphosted.com with ESMTP id 29grgngp54-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Fri, 31 Mar 2017 15:50:51 -0700 Received: from debian.brocade.com (10.120.21.4) by HQ1WP-EXMB12.corp.brocade.com (10.70.20.186) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Fri, 31 Mar 2017 15:50:44 -0700 From: Sagar Abhang To: , CC: , Sagar Abhang Date: Fri, 31 Mar 2017 15:47:10 -0700 Message-ID: <1491000430-9884-1-git-send-email-sabhang@brocade.com> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.120.21.4] X-ClientProxiedBy: hq1wp-excas11.corp.brocade.com (10.70.36.102) To HQ1WP-EXMB12.corp.brocade.com (10.70.20.186) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-03-31_18:, , signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1703310202 Subject: [dpdk-dev] [PATCH] net/vhost: move device stop call in close function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 31 Mar 2017 22:50:53 -0000 Moved the call to "eth_dev_stop" inside "eth_dev_close" because "rte_eth_dev_close" calls 'close' operation of device, and in existing code the close was happening without 'stop' operation for vhost device. Moved code to free rx and tx queues inside "eth_dev_close" because the "rte_eth_dev_close" function calls the vhost's "eth_dev_close" function In that case, the memory allocated for the queues is not freed up before we free the pointer of rx and tx queues causing memory leak. Signed-off-by: Sagar Abhang --- 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 7f5cd7e..100d1cf 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -832,11 +832,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); @@ -848,9 +851,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 @@ -1259,7 +1270,6 @@ static int rte_pmd_vhost_remove(const char *name) { struct rte_eth_dev *eth_dev = NULL; - unsigned int i; RTE_LOG(INFO, PMD, "Un-Initializing pmd_vhost for %s\n", name); @@ -1268,8 +1278,6 @@ rte_pmd_vhost_remove(const char *name) if (eth_dev == NULL) return -ENODEV; - eth_dev_stop(eth_dev); - eth_dev_close(eth_dev); if (rte_atomic16_sub_return(&nb_started_ports, 1) == 0) @@ -1278,12 +1286,6 @@ rte_pmd_vhost_remove(const char *name) 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.1.4