From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <luca.boccassi@gmail.com>
Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com
 [209.85.221.65]) by dpdk.org (Postfix) with ESMTP id 67A9F343C
 for <dev@dpdk.org>; Wed, 19 Sep 2018 14:58:15 +0200 (CEST)
Received: by mail-wr1-f65.google.com with SMTP id a108-v6so5679456wrc.13
 for <dev@dpdk.org>; Wed, 19 Sep 2018 05:58:15 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
 :references;
 bh=oFsaAzc/ia0HQrdN2OIOnfFX+61bMmIKXRVsmdt2e7o=;
 b=h3rSXcWI4MYu4ybOhmX0E3v5Ee55+4IEqGpx5S6YqTr+tpy5oG869hDACq9lCAoDW5
 AXUMXFc2lM2Q3JCSEsaw/ENvuXNQlRwoEBXHUfDQFJeagWyTKUVzfSYlr/DvLhSpDA+n
 oO97m9VqXVqupKiqOxGxKX5sBq/JLc2qV8aKNWjPrfNTsBkPK4NIkZ0mpZU38f75BBvT
 ZoSkjtyTbqW2dzXS7ekLQtcjxg+YnqJOjhNtwtxSdT/da+vX9K1cIc3+EkHk6X5HXGQN
 zX+msUU5iBxja2yMI9iWMppK7N+3ZjMd/o6zy63M0KLuAVcRryn3Ieqdy/aAQf1FqjVP
 YROQ==
X-Gm-Message-State: APzg51Abck2LMtvzM+Y3RqRZO8OnMue319k8EBqbu/LBlxia5e28th6a
 vxQxIy6dH85aWgrJxEapiR8Q1XSeDew=
X-Google-Smtp-Source: ANB0Vdan95qjQgmu7OwbHbp1UyaaibWKkcsrW0rJfv284alH3AbixXM5HeD5L9r+cr/kri2GY2st3Q==
X-Received: by 2002:adf:fd12:: with SMTP id
 e18-v6mr29567140wrr.280.1537361894646; 
 Wed, 19 Sep 2018 05:58:14 -0700 (PDT)
Received: from localhost ([2001:1be0:110d:fcfe:489f:80a9:5d59:c6bd])
 by smtp.gmail.com with ESMTPSA id o15-v6sm21468205wru.23.2018.09.19.05.58.12
 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
 Wed, 19 Sep 2018 05:58:13 -0700 (PDT)
From: Luca Boccassi <bluca@debian.org>
To: dev@dpdk.org
Cc: maxime.coquelin@redhat.com, tiwei.bie@intel.com, yongwang@vmware.com,
 3chas3@gmail.com, bruce.richardson@intel.com, jianfeng.tan@intel.com,
 anatoly.burakov@intel.com, llouis@vmware.com, brussell@vyatta.att-mail.com
Date: Wed, 19 Sep 2018 13:57:56 +0100
Message-Id: <20180919125757.17938-2-bluca@debian.org>
X-Mailer: git-send-email 2.18.0
In-Reply-To: <20180919125757.17938-1-bluca@debian.org>
References: <20180816135032.28283-1-bluca@debian.org>
 <20180919125757.17938-1-bluca@debian.org>
Subject: [dpdk-dev] [PATCH v2 2/3] net/vmxnet3: fix vmxnet3 dev_uninit()
	hot-unplug
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 19 Sep 2018 12:58:15 -0000

The vmxnet3 driver can't call back into dev_close(), and possibly
dev_stop(), in dev_uninit().  When dev_uninit() is called, anything
that those routines would want to clean up has already been released.
Further, for complete cleanup, it is necessary to release any of the
queue resources during dev_close().
This allows a vmxnet3 device to be hot-unplugged without leaking
queues.

Fixes: dfaff37fc46d ("vmxnet3: import new vmxnet3 poll mode driver implementation")
Cc: stable@dpdk.org

Signed-off-by: Brian Russell <brussell@brocade.com>
Signed-off-by: Luca Boccassi <bluca@debian.org>
---
v2: add back extra close() call in uninit() for buggy applications as
    requested by the reviewers, and add debug log noting the issue

 drivers/net/vmxnet3/vmxnet3_ethdev.c | 35 +++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index f1596ab19d..98e5d01890 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -354,8 +354,10 @@ eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	if (hw->adapter_stopped == 0)
+	if (hw->adapter_stopped == 0) {
+		PMD_INIT_LOG(DEBUG, "Device has not been closed.");
 		vmxnet3_dev_close(eth_dev);
+	}
 
 	eth_dev->dev_ops = NULL;
 	eth_dev->rx_pkt_burst = NULL;
@@ -802,7 +804,7 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
 	PMD_INIT_FUNC_TRACE();
 
 	if (hw->adapter_stopped == 1) {
-		PMD_INIT_LOG(DEBUG, "Device already closed.");
+		PMD_INIT_LOG(DEBUG, "Device already stopped.");
 		return;
 	}
 
@@ -826,7 +828,6 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
 	/* reset the device */
 	VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
 	PMD_INIT_LOG(DEBUG, "Device reset.");
-	hw->adapter_stopped = 0;
 
 	vmxnet3_dev_clear_queues(dev);
 
@@ -836,6 +837,30 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
 	link.link_speed = ETH_SPEED_NUM_10G;
 	link.link_autoneg = ETH_LINK_FIXED;
 	rte_eth_linkstatus_set(dev, &link);
+
+	hw->adapter_stopped = 1;
+}
+
+static void
+vmxnet3_free_queues(struct rte_eth_dev *dev)
+{
+	int i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		void *rxq = dev->data->rx_queues[i];
+
+		vmxnet3_dev_rx_queue_release(rxq);
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		void *txq = dev->data->tx_queues[i];
+
+		vmxnet3_dev_tx_queue_release(txq);
+	}
+	dev->data->nb_tx_queues = 0;
 }
 
 /*
@@ -844,12 +869,10 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
 static void
 vmxnet3_dev_close(struct rte_eth_dev *dev)
 {
-	struct vmxnet3_hw *hw = dev->data->dev_private;
-
 	PMD_INIT_FUNC_TRACE();
 
 	vmxnet3_dev_stop(dev);
-	hw->adapter_stopped = 1;
+	vmxnet3_free_queues(dev);
 }
 
 static void
-- 
2.18.0