[dpdk-stable] patch 'net/i40e: fix queue pairs configuration in VF' has been queued to stable release 19.11.4

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Jul 24 13:59:58 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 71e127b7febe0c9ce6456e4b7f2580679e63e4e2 Mon Sep 17 00:00:00 2001
From: Alvin Zhang <alvinx.zhang at intel.com>
Date: Thu, 16 Jul 2020 14:33:36 +0800
Subject: [PATCH] net/i40e: fix queue pairs configuration in VF

[ upstream commit e230514582c8734424c6804d22d21427e9c3a088 ]

If a VF request PF to allocate more number of queue pairs, the PF will
free the queue pairs which have been allocated and reset the VF. So,
VF should stop to work until all the process is done. This patch modify
the process of the request queue pairs. To improve efficiency and
eliminate code redundancy, the promiscuous ops were also updated.

Fixes: c48eb308ed13 ("net/i40e: support VF request more queues")

Signed-off-by: Alvin Zhang <alvinx.zhang at intel.com>
Acked-by: Jeff Guo <jia.guo at intel.com>
---
 drivers/net/i40e/i40e_ethdev_vf.c | 112 ++++++++++++++----------------
 1 file changed, 54 insertions(+), 58 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 1f1764908..0381ba64e 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -91,7 +91,8 @@ static int i40evf_vlan_filter_set(struct rte_eth_dev *dev,
 				  uint16_t vlan_id, int on);
 static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void i40evf_dev_close(struct rte_eth_dev *dev);
-static int  i40evf_dev_reset(struct rte_eth_dev *dev);
+static int i40evf_dev_reset(struct rte_eth_dev *dev);
+static int i40evf_check_vf_reset_done(struct rte_eth_dev *dev);
 static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
 static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);
 static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);
@@ -518,10 +519,19 @@ i40evf_config_promisc(struct rte_eth_dev *dev,
 
 	err = i40evf_execute_vf_cmd(dev, &args);
 
-	if (err)
+	if (err) {
 		PMD_DRV_LOG(ERR, "fail to execute command "
 			    "CONFIG_PROMISCUOUS_MODE");
-	return err;
+
+		if (err == I40E_NOT_SUPPORTED)
+			return -ENOTSUP;
+
+		return -EAGAIN;
+	}
+
+	vf->promisc_unicast_enabled = enable_unicast;
+	vf->promisc_multicast_enabled = enable_multicast;
+	return 0;
 }
 
 static int
@@ -1055,12 +1065,28 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num)
 	args.out_size = I40E_AQ_BUF_SZ;
 
 	rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
+
 	err = i40evf_execute_vf_cmd(dev, &args);
-	if (err)
+
+	rte_eal_alarm_set(I40EVF_ALARM_INTERVAL, i40evf_dev_alarm_handler, dev);
+
+	if (err != I40E_SUCCESS) {
 		PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES");
+		return err;
+	}
+
+	/* The PF will issue a reset to the VF when change the number of
+	 * queues. The PF will set I40E_VFGEN_RSTAT to COMPLETE first, then
+	 * wait 10ms and set it to ACTIVE. In this duration, vf may not catch
+	 * the moment that COMPLETE is set. So, for vf, we'll try to wait a
+	 * long time.
+	 */
+	rte_delay_ms(100);
+
+	err = i40evf_check_vf_reset_done(dev);
+	if (err)
+		PMD_DRV_LOG(ERR, "VF is still resetting");
 
-	rte_eal_alarm_set(I40EVF_ALARM_INTERVAL,
-			  i40evf_dev_alarm_handler, dev);
 	return err;
 }
 
@@ -1490,7 +1516,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 	hw->bus.device = pci_dev->addr.devid;
 	hw->bus.func = pci_dev->addr.function;
 	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
-	hw->adapter_stopped = 0;
+	hw->adapter_stopped = 1;
 	hw->adapter_closed = 0;
 
 	/* Pass the information to the rte_eth_dev_close() that it should also
@@ -1586,7 +1612,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
 	ad->tx_vec_allowed = true;
 
 	if (num_queue_pairs > vf->vsi_res->num_queue_pairs) {
-		int ret = 0;
+		struct i40e_hw *hw;
+		int ret;
+
+		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+			PMD_DRV_LOG(ERR,
+				    "For secondary processes, change queue pairs is not supported!");
+			return -ENOTSUP;
+		}
+
+		hw  = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+		if (!hw->adapter_stopped) {
+			PMD_DRV_LOG(ERR, "Device must be stopped first!");
+			return -EBUSY;
+		}
 
 		PMD_DRV_LOG(INFO, "change queue pairs from %u to %u",
 			    vf->vsi_res->num_queue_pairs, num_queue_pairs);
@@ -2158,76 +2197,32 @@ static int
 i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-	int ret;
 
-	/* If enabled, just return */
-	if (vf->promisc_unicast_enabled)
-		return 0;
-
-	ret = i40evf_config_promisc(dev, 1, vf->promisc_multicast_enabled);
-	if (ret == 0)
-		vf->promisc_unicast_enabled = TRUE;
-	else
-		ret = -EAGAIN;
-
-	return ret;
+	return i40evf_config_promisc(dev, true, vf->promisc_multicast_enabled);
 }
 
 static int
 i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-	int ret;
 
-	/* If disabled, just return */
-	if (!vf->promisc_unicast_enabled)
-		return 0;
-
-	ret = i40evf_config_promisc(dev, 0, vf->promisc_multicast_enabled);
-	if (ret == 0)
-		vf->promisc_unicast_enabled = FALSE;
-	else
-		ret = -EAGAIN;
-
-	return ret;
+	return i40evf_config_promisc(dev, false, vf->promisc_multicast_enabled);
 }
 
 static int
 i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-	int ret;
 
-	/* If enabled, just return */
-	if (vf->promisc_multicast_enabled)
-		return 0;
-
-	ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 1);
-	if (ret == 0)
-		vf->promisc_multicast_enabled = TRUE;
-	else
-		ret = -EAGAIN;
-
-	return ret;
+	return i40evf_config_promisc(dev, vf->promisc_unicast_enabled, true);
 }
 
 static int
 i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-	int ret;
 
-	/* If enabled, just return */
-	if (!vf->promisc_multicast_enabled)
-		return 0;
-
-	ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 0);
-	if (ret == 0)
-		vf->promisc_multicast_enabled = FALSE;
-	else
-		ret = -EAGAIN;
-
-	return ret;
+	return i40evf_config_promisc(dev, vf->promisc_unicast_enabled, false);
 }
 
 static int
@@ -2349,8 +2344,9 @@ i40evf_dev_close(struct rte_eth_dev *dev)
 	 * it is a workaround solution when work with kernel driver
 	 * and it is not the normal way
 	 */
-	i40evf_dev_promiscuous_disable(dev);
-	i40evf_dev_allmulticast_disable(dev);
+	if (vf->promisc_unicast_enabled || vf->promisc_multicast_enabled)
+		i40evf_config_promisc(dev, false, false);
+
 	rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
 
 	i40evf_reset_vf(dev);
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-07-24 12:53:54.724871645 +0100
+++ 0160-net-i40e-fix-queue-pairs-configuration-in-VF.patch	2020-07-24 12:53:48.527010931 +0100
@@ -1,8 +1,10 @@
-From e230514582c8734424c6804d22d21427e9c3a088 Mon Sep 17 00:00:00 2001
+From 71e127b7febe0c9ce6456e4b7f2580679e63e4e2 Mon Sep 17 00:00:00 2001
 From: Alvin Zhang <alvinx.zhang at intel.com>
 Date: Thu, 16 Jul 2020 14:33:36 +0800
 Subject: [PATCH] net/i40e: fix queue pairs configuration in VF
 
+[ upstream commit e230514582c8734424c6804d22d21427e9c3a088 ]
+
 If a VF request PF to allocate more number of queue pairs, the PF will
 free the queue pairs which have been allocated and reset the VF. So,
 VF should stop to work until all the process is done. This patch modify
@@ -10,16 +12,15 @@
 eliminate code redundancy, the promiscuous ops were also updated.
 
 Fixes: c48eb308ed13 ("net/i40e: support VF request more queues")
-Cc: stable at dpdk.org
 
 Signed-off-by: Alvin Zhang <alvinx.zhang at intel.com>
 Acked-by: Jeff Guo <jia.guo at intel.com>
 ---
- drivers/net/i40e/i40e_ethdev_vf.c | 104 ++++++++++++++++--------------
- 1 file changed, 54 insertions(+), 50 deletions(-)
+ drivers/net/i40e/i40e_ethdev_vf.c | 112 ++++++++++++++----------------
+ 1 file changed, 54 insertions(+), 58 deletions(-)
 
 diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
-index eca716a6a..69cab8e73 100644
+index 1f1764908..0381ba64e 100644
 --- a/drivers/net/i40e/i40e_ethdev_vf.c
 +++ b/drivers/net/i40e/i40e_ethdev_vf.c
 @@ -91,7 +91,8 @@ static int i40evf_vlan_filter_set(struct rte_eth_dev *dev,
@@ -32,7 +33,7 @@
  static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
  static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);
  static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);
-@@ -519,10 +520,19 @@ i40evf_config_promisc(struct rte_eth_dev *dev,
+@@ -518,10 +519,19 @@ i40evf_config_promisc(struct rte_eth_dev *dev,
  
  	err = i40evf_execute_vf_cmd(dev, &args);
  
@@ -54,7 +55,7 @@
  }
  
  static int
-@@ -1081,12 +1091,28 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num)
+@@ -1055,12 +1065,28 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num)
  	args.out_size = I40E_AQ_BUF_SZ;
  
  	rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
@@ -86,7 +87,7 @@
  	return err;
  }
  
-@@ -1514,7 +1540,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
+@@ -1490,7 +1516,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
  	hw->bus.device = pci_dev->addr.devid;
  	hw->bus.func = pci_dev->addr.function;
  	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
@@ -95,7 +96,7 @@
  	hw->adapter_closed = 0;
  
  	/* Pass the information to the rte_eth_dev_close() that it should also
-@@ -1610,7 +1636,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
+@@ -1586,7 +1612,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
  	ad->tx_vec_allowed = true;
  
  	if (num_queue_pairs > vf->vsi_res->num_queue_pairs) {
@@ -117,17 +118,19 @@
  
  		PMD_DRV_LOG(INFO, "change queue pairs from %u to %u",
  			    vf->vsi_res->num_queue_pairs, num_queue_pairs);
-@@ -2182,68 +2221,32 @@ static int
+@@ -2158,76 +2197,32 @@ static int
  i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev)
  {
  	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 -	int ret;
  
+-	/* If enabled, just return */
+-	if (vf->promisc_unicast_enabled)
+-		return 0;
+-
 -	ret = i40evf_config_promisc(dev, 1, vf->promisc_multicast_enabled);
 -	if (ret == 0)
 -		vf->promisc_unicast_enabled = TRUE;
--	else if (ret == I40E_NOT_SUPPORTED)
--		ret = -ENOTSUP;
 -	else
 -		ret = -EAGAIN;
 -
@@ -141,11 +144,13 @@
  	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 -	int ret;
  
+-	/* If disabled, just return */
+-	if (!vf->promisc_unicast_enabled)
+-		return 0;
+-
 -	ret = i40evf_config_promisc(dev, 0, vf->promisc_multicast_enabled);
 -	if (ret == 0)
 -		vf->promisc_unicast_enabled = FALSE;
--	else if (ret == I40E_NOT_SUPPORTED)
--		ret = -ENOTSUP;
 -	else
 -		ret = -EAGAIN;
 -
@@ -159,11 +164,13 @@
  	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 -	int ret;
  
+-	/* If enabled, just return */
+-	if (vf->promisc_multicast_enabled)
+-		return 0;
+-
 -	ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 1);
 -	if (ret == 0)
 -		vf->promisc_multicast_enabled = TRUE;
--	else if (ret == I40E_NOT_SUPPORTED)
--		ret = -ENOTSUP;
 -	else
 -		ret = -EAGAIN;
 -
@@ -177,11 +184,13 @@
  	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 -	int ret;
  
+-	/* If enabled, just return */
+-	if (!vf->promisc_multicast_enabled)
+-		return 0;
+-
 -	ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 0);
 -	if (ret == 0)
 -		vf->promisc_multicast_enabled = FALSE;
--	else if (ret == I40E_NOT_SUPPORTED)
--		ret = -ENOTSUP;
 -	else
 -		ret = -EAGAIN;
 -
@@ -190,7 +199,7 @@
  }
  
  static int
-@@ -2365,8 +2368,9 @@ i40evf_dev_close(struct rte_eth_dev *dev)
+@@ -2349,8 +2344,9 @@ i40evf_dev_close(struct rte_eth_dev *dev)
  	 * it is a workaround solution when work with kernel driver
  	 * and it is not the normal way
  	 */


More information about the stable mailing list