[dpdk-stable] patch 'net/netvsc: do not query VF link state' has been queued to stable release 19.11.4

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Jul 24 13:57:27 CEST 2020


Hi,

FYI, your patch has been queued to stable release 19.11.4

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 07/26/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 bbcbaf834f0ef6e42c17fb47745953747b370e3d Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen at networkplumber.org>
Date: Tue, 19 May 2020 09:52:28 -0700
Subject: [PATCH] net/netvsc: do not query VF link state

[ upstream commit a4f53bec7c0a8eebeb8ccff0afa46bfedf932916 ]

When the primary device link state is queried, there is no
need to query the VF state as well. The application only sees
the state of the synthetic device.

Fixes: dc7680e8597c ("net/netvsc: support integrated VF")

Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
 drivers/net/netvsc/hn_ethdev.c |  4 +-
 drivers/net/netvsc/hn_var.h    |  3 --
 drivers/net/netvsc/hn_vf.c     | 99 +++++-----------------------------
 3 files changed, 15 insertions(+), 91 deletions(-)

diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c
index 6950682a9..20cf1cc90 100644
--- a/drivers/net/netvsc/hn_ethdev.c
+++ b/drivers/net/netvsc/hn_ethdev.c
@@ -201,7 +201,7 @@ static int hn_parse_args(const struct rte_eth_dev *dev)
  */
 int
 hn_dev_link_update(struct rte_eth_dev *dev,
-		   int wait_to_complete)
+		   int wait_to_complete __rte_unused)
 {
 	struct hn_data *hv = dev->data->dev_private;
 	struct rte_eth_link link, old;
@@ -215,8 +215,6 @@ hn_dev_link_update(struct rte_eth_dev *dev,
 
 	hn_rndis_get_linkspeed(hv);
 
-	hn_vf_link_update(dev, wait_to_complete);
-
 	link = (struct rte_eth_link) {
 		.link_duplex = ETH_LINK_FULL_DUPLEX,
 		.link_autoneg = ETH_LINK_SPEED_FIXED,
diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h
index b4c617173..4c1e6b8c3 100644
--- a/drivers/net/netvsc/hn_var.h
+++ b/drivers/net/netvsc/hn_var.h
@@ -140,7 +140,6 @@ struct hn_data {
 	uint16_t	rss_ind[128];
 
 	struct rte_eth_dev_owner owner;
-	struct rte_intr_handle vf_intr;
 
 	struct vmbus_channel *channels[HN_MAX_CHANNELS];
 };
@@ -222,8 +221,6 @@ int	hn_vf_mc_addr_list(struct rte_eth_dev *dev,
 			   struct rte_ether_addr *mc_addr_set,
 			   uint32_t nb_mc_addr);
 
-int	hn_vf_link_update(struct rte_eth_dev *dev,
-			  int wait_to_complete);
 int	hn_vf_tx_queue_setup(struct rte_eth_dev *dev,
 			     uint16_t queue_idx, uint16_t nb_desc,
 			     unsigned int socket_id,
diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c
index 97333b502..4e774d9d9 100644
--- a/drivers/net/netvsc/hn_vf.c
+++ b/drivers/net/netvsc/hn_vf.c
@@ -100,16 +100,8 @@ int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv)
 
 	rte_spinlock_lock(&hv->vf_lock);
 	err = hn_vf_attach(hv, port);
-
-	if (err == 0) {
-		dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-		hv->vf_intr = (struct rte_intr_handle) {
-			.fd = -1,
-			.type = RTE_INTR_HANDLE_EXT,
-		};
-		dev->intr_handle = &hv->vf_intr;
+	if (err == 0)
 		hn_nvs_set_datapath(hv, NVS_DATAPATH_VF);
-	}
 	rte_spinlock_unlock(&hv->vf_lock);
 
 	return err;
@@ -231,80 +223,6 @@ int hn_vf_info_get(struct hn_data *hv, struct rte_eth_dev_info *info)
 	return ret;
 }
 
-int hn_vf_link_update(struct rte_eth_dev *dev,
-		      int wait_to_complete)
-{
-	struct hn_data *hv = dev->data->dev_private;
-	struct rte_eth_dev *vf_dev;
-	int ret = 0;
-
-	rte_spinlock_lock(&hv->vf_lock);
-	vf_dev = hn_get_vf_dev(hv);
-	if (vf_dev && vf_dev->dev_ops->link_update)
-		ret = (*vf_dev->dev_ops->link_update)(vf_dev, wait_to_complete);
-	rte_spinlock_unlock(&hv->vf_lock);
-
-	return ret;
-}
-
-/* called when VF has link state interrupts enabled */
-static int hn_vf_lsc_event(uint16_t port_id __rte_unused,
-			   enum rte_eth_event_type event,
-			   void *cb_arg, void *out __rte_unused)
-{
-	struct rte_eth_dev *dev = cb_arg;
-
-	if (event != RTE_ETH_EVENT_INTR_LSC)
-		return 0;
-
-	/* if link state has changed pass on */
-	if (hn_dev_link_update(dev, 0) == 0)
-		return 0; /* no change */
-
-	return _rte_eth_dev_callback_process(dev,
-					     RTE_ETH_EVENT_INTR_LSC,
-					     NULL);
-}
-
-static int _hn_vf_configure(struct rte_eth_dev *dev,
-			    uint16_t vf_port,
-			    const struct rte_eth_conf *dev_conf)
-{
-	struct rte_eth_conf vf_conf = *dev_conf;
-	struct rte_eth_dev *vf_dev;
-	int ret;
-
-	vf_dev = &rte_eth_devices[vf_port];
-	if (dev_conf->intr_conf.lsc &&
-	    (vf_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)) {
-		PMD_DRV_LOG(DEBUG, "enabling LSC for VF %u",
-			    vf_port);
-		vf_conf.intr_conf.lsc = 1;
-	} else {
-		PMD_DRV_LOG(DEBUG, "disabling LSC for VF %u",
-			    vf_port);
-		vf_conf.intr_conf.lsc = 0;
-	}
-
-	ret = rte_eth_dev_configure(vf_port,
-				    dev->data->nb_rx_queues,
-				    dev->data->nb_tx_queues,
-				    &vf_conf);
-	if (ret) {
-		PMD_DRV_LOG(ERR,
-			    "VF configuration failed: %d", ret);
-	} else if (vf_conf.intr_conf.lsc) {
-		ret = rte_eth_dev_callback_register(vf_port,
-						    RTE_ETH_DEV_INTR_LSC,
-						    hn_vf_lsc_event, dev);
-		if (ret)
-			PMD_DRV_LOG(ERR,
-				    "Failed to register LSC callback for VF %u",
-				    vf_port);
-	}
-	return ret;
-}
-
 /*
  * Configure VF if present.
  * Force VF to have same number of queues as synthetic device
@@ -313,11 +231,22 @@ int hn_vf_configure(struct rte_eth_dev *dev,
 		    const struct rte_eth_conf *dev_conf)
 {
 	struct hn_data *hv = dev->data->dev_private;
+	struct rte_eth_conf vf_conf = *dev_conf;
 	int ret = 0;
 
+	/* link state interrupt does not matter here. */
+	vf_conf.intr_conf.lsc = 0;
+
 	rte_spinlock_lock(&hv->vf_lock);
-	if (hv->vf_port != HN_INVALID_PORT)
-		ret = _hn_vf_configure(dev, hv->vf_port, dev_conf);
+	if (hv->vf_port != HN_INVALID_PORT) {
+		ret = rte_eth_dev_configure(hv->vf_port,
+					    dev->data->nb_rx_queues,
+					    dev->data->nb_tx_queues,
+					    &vf_conf);
+		if (ret != 0)
+			PMD_DRV_LOG(ERR,
+				    "VF configuration failed: %d", ret);
+	}
 	rte_spinlock_unlock(&hv->vf_lock);
 	return ret;
 }
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-07-24 12:53:48.946131528 +0100
+++ 0009-net-netvsc-do-not-query-VF-link-state.patch	2020-07-24 12:53:48.159004075 +0100
@@ -1,27 +1,28 @@
-From a4f53bec7c0a8eebeb8ccff0afa46bfedf932916 Mon Sep 17 00:00:00 2001
+From bbcbaf834f0ef6e42c17fb47745953747b370e3d Mon Sep 17 00:00:00 2001
 From: Stephen Hemminger <stephen at networkplumber.org>
 Date: Tue, 19 May 2020 09:52:28 -0700
 Subject: [PATCH] net/netvsc: do not query VF link state
 
+[ upstream commit a4f53bec7c0a8eebeb8ccff0afa46bfedf932916 ]
+
 When the primary device link state is queried, there is no
 need to query the VF state as well. The application only sees
 the state of the synthetic device.
 
 Fixes: dc7680e8597c ("net/netvsc: support integrated VF")
-Cc: stable at dpdk.org
 
 Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
 ---
  drivers/net/netvsc/hn_ethdev.c |  4 +-
  drivers/net/netvsc/hn_var.h    |  3 --
- drivers/net/netvsc/hn_vf.c     | 98 +++++-----------------------------
- 3 files changed, 15 insertions(+), 90 deletions(-)
+ drivers/net/netvsc/hn_vf.c     | 99 +++++-----------------------------
+ 3 files changed, 15 insertions(+), 91 deletions(-)
 
 diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c
-index 0f4827c54..ac182a548 100644
+index 6950682a9..20cf1cc90 100644
 --- a/drivers/net/netvsc/hn_ethdev.c
 +++ b/drivers/net/netvsc/hn_ethdev.c
-@@ -202,7 +202,7 @@ static int hn_parse_args(const struct rte_eth_dev *dev)
+@@ -201,7 +201,7 @@ static int hn_parse_args(const struct rte_eth_dev *dev)
   */
  int
  hn_dev_link_update(struct rte_eth_dev *dev,
@@ -30,7 +31,7 @@
  {
  	struct hn_data *hv = dev->data->dev_private;
  	struct rte_eth_link link, old;
-@@ -216,8 +216,6 @@ hn_dev_link_update(struct rte_eth_dev *dev,
+@@ -215,8 +215,6 @@ hn_dev_link_update(struct rte_eth_dev *dev,
  
  	hn_rndis_get_linkspeed(hv);
  
@@ -40,10 +41,10 @@
  		.link_duplex = ETH_LINK_FULL_DUPLEX,
  		.link_autoneg = ETH_LINK_SPEED_FIXED,
 diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h
-index 20363389a..881832d85 100644
+index b4c617173..4c1e6b8c3 100644
 --- a/drivers/net/netvsc/hn_var.h
 +++ b/drivers/net/netvsc/hn_var.h
-@@ -141,7 +141,6 @@ struct hn_data {
+@@ -140,7 +140,6 @@ struct hn_data {
  	uint16_t	rss_ind[128];
  
  	struct rte_eth_dev_owner owner;
@@ -51,7 +52,7 @@
  
  	struct vmbus_channel *channels[HN_MAX_CHANNELS];
  };
-@@ -228,8 +227,6 @@ int	hn_vf_mc_addr_list(struct rte_eth_dev *dev,
+@@ -222,8 +221,6 @@ int	hn_vf_mc_addr_list(struct rte_eth_dev *dev,
  			   struct rte_ether_addr *mc_addr_set,
  			   uint32_t nb_mc_addr);
  
@@ -61,13 +62,14 @@
  			     uint16_t queue_idx, uint16_t nb_desc,
  			     unsigned int socket_id,
 diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c
-index a745c7c36..f5f15c046 100644
+index 97333b502..4e774d9d9 100644
 --- a/drivers/net/netvsc/hn_vf.c
 +++ b/drivers/net/netvsc/hn_vf.c
-@@ -97,15 +97,8 @@ int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv)
- 	}
+@@ -100,16 +100,8 @@ int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv)
  
+ 	rte_spinlock_lock(&hv->vf_lock);
  	err = hn_vf_attach(hv, port);
+-
 -	if (err == 0) {
 -		dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
 -		hv->vf_intr = (struct rte_intr_handle) {
@@ -78,10 +80,10 @@
 +	if (err == 0)
  		hn_nvs_set_datapath(hv, NVS_DATAPATH_VF);
 -	}
+ 	rte_spinlock_unlock(&hv->vf_lock);
  
  	return err;
- }
-@@ -223,80 +216,6 @@ int hn_vf_info_get(struct hn_data *hv, struct rte_eth_dev_info *info)
+@@ -231,80 +223,6 @@ int hn_vf_info_get(struct hn_data *hv, struct rte_eth_dev_info *info)
  	return ret;
  }
  
@@ -92,11 +94,11 @@
 -	struct rte_eth_dev *vf_dev;
 -	int ret = 0;
 -
--	rte_rwlock_read_lock(&hv->vf_lock);
+-	rte_spinlock_lock(&hv->vf_lock);
 -	vf_dev = hn_get_vf_dev(hv);
 -	if (vf_dev && vf_dev->dev_ops->link_update)
 -		ret = (*vf_dev->dev_ops->link_update)(vf_dev, wait_to_complete);
--	rte_rwlock_read_unlock(&hv->vf_lock);
+-	rte_spinlock_unlock(&hv->vf_lock);
 -
 -	return ret;
 -}
@@ -162,7 +164,7 @@
  /*
   * Configure VF if present.
   * Force VF to have same number of queues as synthetic device
-@@ -305,11 +224,22 @@ int hn_vf_configure(struct rte_eth_dev *dev,
+@@ -313,11 +231,22 @@ int hn_vf_configure(struct rte_eth_dev *dev,
  		    const struct rte_eth_conf *dev_conf)
  {
  	struct hn_data *hv = dev->data->dev_private;
@@ -172,7 +174,7 @@
 +	/* link state interrupt does not matter here. */
 +	vf_conf.intr_conf.lsc = 0;
 +
- 	rte_rwlock_read_lock(&hv->vf_lock);
+ 	rte_spinlock_lock(&hv->vf_lock);
 -	if (hv->vf_port != HN_INVALID_PORT)
 -		ret = _hn_vf_configure(dev, hv->vf_port, dev_conf);
 +	if (hv->vf_port != HN_INVALID_PORT) {
@@ -184,7 +186,7 @@
 +			PMD_DRV_LOG(ERR,
 +				    "VF configuration failed: %d", ret);
 +	}
- 	rte_rwlock_read_unlock(&hv->vf_lock);
+ 	rte_spinlock_unlock(&hv->vf_lock);
  	return ret;
  }
 -- 


More information about the stable mailing list