From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <stable-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by inbox.dpdk.org (Postfix) with ESMTP id A5A75A0553
	for <public@inbox.dpdk.org>; Mon, 17 Feb 2020 18:46:58 +0100 (CET)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id 9F7A41DA12;
	Mon, 17 Feb 2020 18:46:58 +0100 (CET)
Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com
 [209.85.221.68]) by dpdk.org (Postfix) with ESMTP id 193151DA12
 for <stable@dpdk.org>; Mon, 17 Feb 2020 18:46:57 +0100 (CET)
Received: by mail-wr1-f68.google.com with SMTP id u6so20853946wrt.0
 for <stable@dpdk.org>; Mon, 17 Feb 2020 09:46:57 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=from:to:cc:subject:date:message-id:in-reply-to:references
 :mime-version:content-transfer-encoding;
 bh=UXB6sqBImiHZTVEKSy6GhbDOnQP8M5jWj8DCXDHnMqk=;
 b=SNuxzA7lOzcshPnEWVs9q53yb6mNMCoPWUghF90RrG7Qn7uwXdbLNnS+AgPTWDfTq9
 OuvslHtysTWK4b1YPHbm0GU7NU9INPb+vE5cPz2+74ljewHN5X8vPaehEAQfZz2L7PUf
 Ij0StfrZmoQEUYn+RQnnZFiCDVsWUvPaeWgDWAMf1Qm8cfWJ0LCRglC2dZaCOlDDK76l
 lbezMF5hZFj4E8KMQDSLrURInCL0+zdAhLrQKVMSlLCThm0qBj6WXEFlKy1VOS46rIH+
 wgn2VnfW6pf/HrH83paYirSu8OVQs94h2fBd2lCROVeHAl9VJr3cxb5UCTfMgk3gMJut
 zF5Q==
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:mime-version:content-transfer-encoding;
 bh=UXB6sqBImiHZTVEKSy6GhbDOnQP8M5jWj8DCXDHnMqk=;
 b=c9fhfv4eubGmme8Z+CNjUvwZsuPkbMCYkc4YnKT11UsCOQw6/COKhSbxGWlnkMy0VL
 Pk3Ui0A2HQ663dvm4gvxYi8evmyLIAhIJAMBte7s1XmSYZl5lyf4FqxHwn0zh/TkgtHw
 dtHB5ICyGVF5FXElyJ1AlBuK9hPtPtQe2ok3r+W296szXipq0prHxk4pU8uDXT30Vqo2
 sHy7N9qk3SAEGJtAkfkyCRcNNxjXtZwK2OGQGeJeYkysT5O1qpQKG02pM42dV2N8FGYA
 UXP2lY+5C7OLpk178t/kvr1WoaMTBDVeKUpT4jiMQ27J7OYRqJfj0W9vIY8cF4hBr5CR
 hfqA==
X-Gm-Message-State: APjAAAXM5AKbJLjlAsiy+6mLaVMCMqAUdIZQ1a6rw42732xDHPR/km4D
 WsFfbk6ABUCWH6psdEH13/A=
X-Google-Smtp-Source: APXvYqy3bWGB4gQQ7ePkMkfk6U7myyxUfTUdqlyxL8uz8cx8ItaMJqTwJmM2uzvMDKnM7snt4qS78Q==
X-Received: by 2002:a5d:45cc:: with SMTP id b12mr22476118wrs.424.1581961616781; 
 Mon, 17 Feb 2020 09:46:56 -0800 (PST)
Received: from localhost (userh634.uk.uudial.com. [194.69.103.7])
 by smtp.gmail.com with ESMTPSA id h71sm201260wme.26.2020.02.17.09.46.56
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 17 Feb 2020 09:46:56 -0800 (PST)
From: luca.boccassi@gmail.com
To: Itsuro Oda <oda@valinux.co.jp>
Cc: Maxime Coquelin <maxime.coquelin@redhat.com>, dpdk stable <stable@dpdk.org>
Date: Mon, 17 Feb 2020 17:45:31 +0000
Message-Id: <20200217174546.25334-39-luca.boccassi@gmail.com>
X-Mailer: git-send-email 2.20.1
In-Reply-To: <20200217174546.25334-1-luca.boccassi@gmail.com>
References: <20200211112216.3929-190-luca.boccassi@gmail.com>
 <20200217174546.25334-1-luca.boccassi@gmail.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: [dpdk-stable] patch 'net/vhost: delay driver setup' has been queued
	to stable release 19.11.1
X-BeenThere: stable@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: patches for DPDK stable branches <stable.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/stable>,
 <mailto:stable-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/stable/>
List-Post: <mailto:stable@dpdk.org>
List-Help: <mailto:stable-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/stable>,
 <mailto:stable-request@dpdk.org?subject=subscribe>
Errors-To: stable-bounces@dpdk.org
Sender: "stable" <stable-bounces@dpdk.org>

Hi,

FYI, your patch has been queued to stable release 19.11.1

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 02/19/20. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Thanks.

Luca Boccassi

---
>From a5bae1950be6e9a347ee460f3e76f052f84acff2 Mon Sep 17 00:00:00 2001
From: Itsuro Oda <oda@valinux.co.jp>
Date: Thu, 6 Feb 2020 10:39:34 +0900
Subject: [PATCH] net/vhost: delay driver setup

[ upstream commit 3d01b759d2679c216725689eabe44147d1737326 ]

Vhost driver setup is delayed at eth_dev configuration
in order to be able to set it from a secondary process.

Fixes: 4852aa8f6e21 ("drivers/net: enable hotplug on secondary process")

Signed-off-by: Itsuro Oda <oda@valinux.co.jp>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 drivers/net/vhost/rte_eth_vhost.c | 130 ++++++++++++++++++------------
 1 file changed, 78 insertions(+), 52 deletions(-)

diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index cea2ead2da..d7bba5c6e2 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -97,6 +97,8 @@ struct pmd_internal {
 	rte_atomic32_t dev_attached;
 	char *dev_name;
 	char *iface_name;
+	uint64_t flags;
+	uint64_t disable_flags;
 	uint16_t max_queues;
 	int vid;
 	rte_atomic32_t started;
@@ -491,17 +493,6 @@ out:
 	return nb_tx;
 }
 
-static int
-eth_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	struct pmd_internal *internal = dev->data->dev_private;
-	const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
-
-	internal->vlan_strip = !!(rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
-
-	return 0;
-}
-
 static inline struct internal_list *
 find_internal_resource(char *ifname)
 {
@@ -877,6 +868,62 @@ static struct vhost_device_ops vhost_ops = {
 	.vring_state_changed = vring_state_changed,
 };
 
+static int
+vhost_driver_setup(struct rte_eth_dev *eth_dev)
+{
+	struct pmd_internal *internal = eth_dev->data->dev_private;
+	struct internal_list *list = NULL;
+	struct rte_vhost_vring_state *vring_state = NULL;
+	unsigned int numa_node = eth_dev->device->numa_node;
+	const char *name = eth_dev->device->name;
+
+	list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node);
+	if (list == NULL)
+		goto error;
+
+	vring_state = rte_zmalloc_socket(name, sizeof(*vring_state),
+					 0, numa_node);
+	if (vring_state == NULL)
+		goto error;
+
+	list->eth_dev = eth_dev;
+	pthread_mutex_lock(&internal_list_lock);
+	TAILQ_INSERT_TAIL(&internal_list, list, next);
+	pthread_mutex_unlock(&internal_list_lock);
+
+	rte_spinlock_init(&vring_state->lock);
+	vring_states[eth_dev->data->port_id] = vring_state;
+
+	if (rte_vhost_driver_register(internal->iface_name, internal->flags))
+		goto error;
+
+	if (internal->disable_flags) {
+		if (rte_vhost_driver_disable_features(internal->iface_name,
+						      internal->disable_flags))
+			goto error;
+	}
+
+	if (rte_vhost_driver_callback_register(internal->iface_name,
+					       &vhost_ops) < 0) {
+		VHOST_LOG(ERR, "Can't register callbacks\n");
+		goto error;
+	}
+
+	if (rte_vhost_driver_start(internal->iface_name) < 0) {
+		VHOST_LOG(ERR, "Failed to start driver for %s\n",
+			  internal->iface_name);
+		goto error;
+	}
+
+	return 0;
+
+error:
+	rte_free(vring_state);
+	rte_free(list);
+
+	return -1;
+}
+
 int
 rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event)
@@ -943,6 +990,24 @@ rte_eth_vhost_get_vid_from_port_id(uint16_t port_id)
 	return vid;
 }
 
+static int
+eth_dev_configure(struct rte_eth_dev *dev)
+{
+	struct pmd_internal *internal = dev->data->dev_private;
+	const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+
+	/* NOTE: the same process has to operate a vhost interface
+	 * from beginning to end (from eth_dev configure to eth_dev close).
+	 * It is user's responsibility at the moment.
+	 */
+	if (vhost_driver_setup(dev) < 0)
+		return -1;
+
+	internal->vlan_strip = !!(rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
+
+	return 0;
+}
+
 static int
 eth_dev_start(struct rte_eth_dev *eth_dev)
 {
@@ -1219,16 +1284,10 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
 	struct pmd_internal *internal = NULL;
 	struct rte_eth_dev *eth_dev = NULL;
 	struct rte_ether_addr *eth_addr = NULL;
-	struct rte_vhost_vring_state *vring_state = NULL;
-	struct internal_list *list = NULL;
 
 	VHOST_LOG(INFO, "Creating VHOST-USER backend on numa socket %u\n",
 		numa_node);
 
-	list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node);
-	if (list == NULL)
-		goto error;
-
 	/* reserve an ethdev entry */
 	eth_dev = rte_eth_vdev_allocate(dev, sizeof(*internal));
 	if (eth_dev == NULL)
@@ -1242,11 +1301,6 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
 	*eth_addr = base_eth_addr;
 	eth_addr->addr_bytes[5] = eth_dev->data->port_id;
 
-	vring_state = rte_zmalloc_socket(name,
-			sizeof(*vring_state), 0, numa_node);
-	if (vring_state == NULL)
-		goto error;
-
 	/* now put it all together
 	 * - store queue data in internal,
 	 * - point eth_dev_data to internals
@@ -1262,18 +1316,12 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
 		goto error;
 	strcpy(internal->iface_name, iface_name);
 
-	list->eth_dev = eth_dev;
-	pthread_mutex_lock(&internal_list_lock);
-	TAILQ_INSERT_TAIL(&internal_list, list, next);
-	pthread_mutex_unlock(&internal_list_lock);
-
-	rte_spinlock_init(&vring_state->lock);
-	vring_states[eth_dev->data->port_id] = vring_state;
-
 	data->nb_rx_queues = queues;
 	data->nb_tx_queues = queues;
 	internal->max_queues = queues;
 	internal->vid = -1;
+	internal->flags = flags;
+	internal->disable_flags = disable_flags;
 	data->dev_link = pmd_link;
 	data->dev_flags = RTE_ETH_DEV_INTR_LSC | RTE_ETH_DEV_CLOSE_REMOVE;
 
@@ -1283,26 +1331,6 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
 	eth_dev->rx_pkt_burst = eth_vhost_rx;
 	eth_dev->tx_pkt_burst = eth_vhost_tx;
 
-	if (rte_vhost_driver_register(iface_name, flags))
-		goto error;
-
-	if (disable_flags) {
-		if (rte_vhost_driver_disable_features(iface_name,
-					disable_flags))
-			goto error;
-	}
-
-	if (rte_vhost_driver_callback_register(iface_name, &vhost_ops) < 0) {
-		VHOST_LOG(ERR, "Can't register callbacks\n");
-		goto error;
-	}
-
-	if (rte_vhost_driver_start(iface_name) < 0) {
-		VHOST_LOG(ERR, "Failed to start driver for %s\n",
-			iface_name);
-		goto error;
-	}
-
 	rte_eth_dev_probing_finish(eth_dev);
 	return 0;
 
@@ -1311,9 +1339,7 @@ error:
 		rte_free(internal->iface_name);
 		free(internal->dev_name);
 	}
-	rte_free(vring_state);
 	rte_eth_dev_release_port(eth_dev);
-	rte_free(list);
 
 	return -1;
 }
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-02-17 17:00:16.405857588 +0000
+++ 0039-net-vhost-delay-driver-setup.patch	2020-02-17 17:00:15.359951192 +0000
@@ -1,13 +1,14 @@
-From 3d01b759d2679c216725689eabe44147d1737326 Mon Sep 17 00:00:00 2001
+From a5bae1950be6e9a347ee460f3e76f052f84acff2 Mon Sep 17 00:00:00 2001
 From: Itsuro Oda <oda@valinux.co.jp>
 Date: Thu, 6 Feb 2020 10:39:34 +0900
 Subject: [PATCH] net/vhost: delay driver setup
 
+[ upstream commit 3d01b759d2679c216725689eabe44147d1737326 ]
+
 Vhost driver setup is delayed at eth_dev configuration
 in order to be able to set it from a secondary process.
 
 Fixes: 4852aa8f6e21 ("drivers/net: enable hotplug on secondary process")
-Cc: stable@dpdk.org
 
 Signed-off-by: Itsuro Oda <oda@valinux.co.jp>
 Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>