DPDK patches and discussions
 help / color / mirror / Atom feed
From: alvinx.zhang@intel.com
To: dev@dpdk.org
Cc: stable@dpdk.org, beilei.xing@intel.com, jia.guo@intel.com,
	maox.jiang@intel.com
Subject: [dpdk-dev] [PATCH v2] net/i40e: fix modify the number of qps in VF
Date: Thu,  2 Jul 2020 11:26:10 +0800
Message-ID: <20200702032610.11076-1-alvinx.zhang@intel.com> (raw)
In-Reply-To: <20200610120703.8268-1-alvinx.zhang@intel.com>

From: Alvin Zhang <alvinx.zhang@intel.com>

For a VF, if the number of request queue pairs is greater than that
has been allocated by the kernel driver, the app may fail to start.
This patch modify the request queue process.

Fixes: c48eb308ed13 ("net/i40e: support VF request more queues")
Fixes: dbda2092deb5 ("net/i40e: fix request queue in VF")
Cc: stable@dpdk.org

Signed-off-by: Alvin Zhang <alvinx.zhang@intel.com>
---

V2: Update git log and modify codes according to comments.
---
 drivers/net/i40e/i40e_ethdev_vf.c | 57 +++++++++++++++++++++++++++++----------
 1 file changed, 43 insertions(+), 14 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index eca716a..55dd237 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -90,6 +90,7 @@ static int i40evf_dev_xstats_get_names(struct rte_eth_dev *dev,
 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_release(struct rte_eth_dev *dev);
 static void i40evf_dev_close(struct rte_eth_dev *dev);
 static int  i40evf_dev_reset(struct rte_eth_dev *dev);
 static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
@@ -1080,13 +1081,10 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *dev,
 	args.out_buffer = vf->aq_resp;
 	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)
 		PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES");
 
-	rte_eal_alarm_set(I40EVF_ALARM_INTERVAL,
-			  i40evf_dev_alarm_handler, dev);
 	return err;
 }
 
@@ -1514,7 +1512,7 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *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
@@ -1610,16 +1608,39 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_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;
+
+		/*
+		 * All VF resources will be reallocated, so change queue pairs
+		 * in secondary processes is forbidden.
+		 */
+		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+			PMD_DRV_LOG(ERR,
+				"For secondary processes, change queue pairs is forbidden!");
+			return -ENOTSUP;
+		}
 
+		hw  = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 		PMD_DRV_LOG(INFO, "change queue pairs from %u to %u",
 			    vf->vsi_res->num_queue_pairs, num_queue_pairs);
+		if (hw->adapter_stopped == 0) {
+			PMD_DRV_LOG(WARNING, "Device must be stopped first!");
+			return -EINVAL;
+		}
+
+		rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
 		ret = i40evf_request_queues(dev, num_queue_pairs);
-		if (ret != 0)
+		if (ret)
 			return ret;
 
-		ret = i40evf_dev_reset(dev);
-		if (ret != 0)
+		/*
+		 * The device has been reseted after queue resources changed
+		 * and must be reinitiated.
+		 */
+		i40evf_dev_release(dev);
+		ret = i40evf_dev_init(dev);
+		if (ret)
 			return ret;
 	}
 
@@ -2356,10 +2377,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)
 i40evf_dev_close(struct rte_eth_dev *dev)
 {
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-
 	i40evf_dev_stop(dev);
-	i40e_dev_free_queues(dev);
 	/*
 	 * disable promiscuous mode before reset vf
 	 * it is a workaround solution when work with kernel driver
@@ -2370,19 +2388,30 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)
 	rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
 
 	i40evf_reset_vf(dev);
-	i40e_shutdown_adminq(hw);
-	i40evf_disable_irq0(hw);
+	i40evf_dev_release(dev);
 
 	dev->dev_ops = NULL;
 	dev->rx_pkt_burst = NULL;
 	dev->tx_pkt_burst = NULL;
 
+	hw->adapter_closed = 1;
+}
+
+static void
+i40evf_dev_release(struct rte_eth_dev *dev)
+{
+	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+
+	i40e_shutdown_adminq(hw);
+	i40evf_disable_irq0(hw);
+
 	rte_free(vf->vf_res);
 	vf->vf_res = NULL;
 	rte_free(vf->aq_resp);
 	vf->aq_resp = NULL;
 
-	hw->adapter_closed = 1;
+	i40e_dev_free_queues(dev);
 }
 
 /*
-- 
1.8.3.1


  parent reply	other threads:[~2020-07-02  3:28 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-10 12:07 [dpdk-dev] [PATCH] net/i40e: fix modifying the number of queues alvinx.zhang
2020-06-21 13:36 ` Jeff Guo
2020-06-29  3:16   ` Zhang, AlvinX
2020-06-30  3:13     ` Jeff Guo
2020-07-02  3:26 ` alvinx.zhang [this message]
2020-07-15  7:28   ` [dpdk-dev] [PATCH v3] net/i40e: fix modify the number of qps in VF alvinx.zhang
2020-07-15 10:17     ` Jeff Guo
2020-07-16  1:38       ` Zhang, AlvinX
2020-07-16  1:52     ` [dpdk-dev] [PATCH v4] " alvinx.zhang
2020-07-16  4:24       ` [dpdk-dev] [PATCH v5] " alvinx.zhang
2020-07-16  4:57         ` Yang, Qiming
2020-07-16  5:13           ` Zhang, AlvinX
2020-07-16  5:12         ` alvinx.zhang
2020-07-16  6:33           ` [dpdk-dev] [PATCH v5] net/i40e: fix qps configuration " alvinx.zhang
2020-07-16  7:30             ` Jeff Guo
2020-07-16  9:14               ` Zhang, Qi Z

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200702032610.11076-1-alvinx.zhang@intel.com \
    --to=alvinx.zhang@intel.com \
    --cc=beilei.xing@intel.com \
    --cc=dev@dpdk.org \
    --cc=jia.guo@intel.com \
    --cc=maox.jiang@intel.com \
    --cc=stable@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git