DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v9 0/3] Support request more queues
@ 2018-12-20 11:01 Zhirun Yan
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 1/3] net/i40e: support VF " Zhirun Yan
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Zhirun Yan @ 2018-12-20 11:01 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

V9
- Rebase to latest

DPDK VF send VIRTCHNL_OP_REQUEST_QUEUES to kernel PF or DPDK VF for
requesting more queues, then PF will allocate more queues.

Zhirun Yan (3):
  net/i40e: support VF request more queues
  net/i40e: support PF respond VF request more queues
  doc: update queue number per vf for i40e

 doc/guides/nics/i40e.rst               | 15 +++---
 doc/guides/rel_notes/release_19_02.rst |  8 +++
 drivers/net/i40e/i40e_ethdev_vf.c      | 65 +++++++++++++++++++++++-
 drivers/net/i40e/i40e_pf.c             | 68 ++++++++++++++++++++++++++
 4 files changed, 148 insertions(+), 8 deletions(-)

-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-dev] [PATCH v9 1/3] net/i40e: support VF request more queues
  2018-12-20 11:01 [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhirun Yan
@ 2018-12-20 11:01 ` Zhirun Yan
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 2/3] net/i40e: support PF respond " Zhirun Yan
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Zhirun Yan @ 2018-12-20 11:01 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan, Haiyue Wang

Before this patch, VF gets a default number of queues from the PF.
This patch enables VF to request a different number. When VF configures
more queues, it will send VIRTCHNL_OP_REQUEST_QUEUES to PF to request
more queues, if success, PF will reset the VF.

User can run "port stop all", "port config port_id rxq/txq queue_num"
and "port start all" to reconfigure queue number.

Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
---
 drivers/net/i40e/i40e_ethdev_vf.c | 65 ++++++++++++++++++++++++++++++-
 1 file changed, 63 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 05dc6596b..bd2cecafa 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -359,6 +359,28 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct vf_cmd_info *args)
 		} while (i++ < MAX_TRY_TIMES);
 		_clear_cmd(vf);
 		break;
+	case VIRTCHNL_OP_REQUEST_QUEUES:
+		/**
+		 * ignore async reply, only wait for system message,
+		 * vf_reset = true if get VIRTCHNL_EVENT_RESET_IMPENDING,
+		 * if not, means request queues failed.
+		 */
+		err = -1;
+		do {
+			ret = i40evf_read_pfmsg(dev, &info);
+			vf->cmd_retval = info.result;
+			if (ret == I40EVF_MSG_SYS && vf->vf_reset) {
+				err = 0;
+				break;
+			} else if (ret == I40EVF_MSG_ERR ||
+					   ret == I40EVF_MSG_CMD) {
+				break;
+			}
+			rte_delay_ms(ASQ_DELAY_MS);
+			/* If don't read msg or read sys event, continue */
+		} while (i++ < MAX_TRY_TIMES);
+		_clear_cmd(vf);
+		break;
 
 	default:
 		/* for other adminq in running time, waiting the cmd done flag */
@@ -1012,6 +1034,28 @@ i40evf_add_vlan(struct rte_eth_dev *dev, uint16_t vlanid)
 	return err;
 }
 
+static int
+i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num)
+{
+	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+	struct virtchnl_vf_res_request vfres;
+	struct vf_cmd_info args;
+	int err;
+
+	vfres.num_queue_pairs = num;
+
+	args.ops = VIRTCHNL_OP_REQUEST_QUEUES;
+	args.in_args = (u8 *)&vfres;
+	args.in_args_size = sizeof(vfres);
+	args.out_buffer = vf->aq_resp;
+	args.out_size = I40E_AQ_BUF_SZ;
+	err = i40evf_execute_vf_cmd(dev, &args);
+	if (err)
+		PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES");
+
+	return err;
+}
+
 static int
 i40evf_del_vlan(struct rte_eth_dev *dev, uint16_t vlanid)
 {
@@ -1516,8 +1560,11 @@ RTE_PMD_REGISTER_KMOD_DEP(net_i40e_vf, "* igb_uio | vfio-pci");
 static int
 i40evf_dev_configure(struct rte_eth_dev *dev)
 {
+	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_adapter *ad =
 		I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	uint16_t num_queue_pairs = RTE_MAX(dev->data->nb_rx_queues,
+				dev->data->nb_tx_queues);
 
 	/* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
 	 * allocation or vector Rx preconditions we will reset it.
@@ -1527,6 +1574,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
 	ad->tx_simple_allowed = true;
 	ad->tx_vec_allowed = true;
 
+	if (num_queue_pairs > vf->vsi_res->num_queue_pairs) {
+		int ret = 0;
+
+		PMD_DRV_LOG(INFO, "change queue pairs from %u to %u",
+			    vf->vsi_res->num_queue_pairs, num_queue_pairs);
+		ret = i40evf_request_queues(dev, num_queue_pairs);
+		if (ret != 0)
+			return ret;
+
+		ret = i40evf_dev_reset(dev);
+		if (ret != 0)
+			return ret;
+	}
+
 	return i40evf_init_vlan(dev);
 }
 
@@ -2145,8 +2206,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 
-	dev_info->max_rx_queues = vf->vsi_res->num_queue_pairs;
-	dev_info->max_tx_queues = vf->vsi_res->num_queue_pairs;
+	dev_info->max_rx_queues = I40E_MAX_QP_NUM_PER_VF;
+	dev_info->max_tx_queues = I40E_MAX_QP_NUM_PER_VF;
 	dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
 	dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
 	dev_info->hash_key_size = (I40E_VFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t);
-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-dev] [PATCH v9 2/3] net/i40e: support PF respond VF request more queues
  2018-12-20 11:01 [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhirun Yan
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 1/3] net/i40e: support VF " Zhirun Yan
@ 2018-12-20 11:01 ` Zhirun Yan
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 3/3] doc: update queue number per vf for i40e Zhirun Yan
  2018-12-20 12:14 ` [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhang, Qi Z
  3 siblings, 0 replies; 5+ messages in thread
From: Zhirun Yan @ 2018-12-20 11:01 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan, Haiyue Wang

This patch respond the VIRTCHNL_OP_REQUEST_QUEUES msg from VF, and
process to allocated more queues for the requested VF. If successful,
PF will notify VF to reset. If unsuccessful, PF will send message to
inform VF.

Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
---
 drivers/net/i40e/i40e_pf.c | 68 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..092e0d3e9 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,69 @@ i40e_notify_vf_link_status(struct rte_eth_dev *dev, struct i40e_pf_vf *vf)
 			I40E_SUCCESS, (uint8_t *)&event, sizeof(event));
 }
 
+/**
+ * i40e_vc_notify_vf_reset
+ * @vf: pointer to the VF structure
+ *
+ * indicate a pending reset to the given VF
+ **/
+static void
+i40e_vc_notify_vf_reset(struct i40e_pf_vf *vf)
+{
+	struct i40e_hw *hw = I40E_PF_TO_HW(vf->pf);
+	struct virtchnl_pf_event pfe;
+	int abs_vf_id;
+	uint16_t vf_id = vf->vf_idx;
+
+	abs_vf_id = vf_id + hw->func_caps.vf_base_id;
+	pfe.event = VIRTCHNL_EVENT_RESET_IMPENDING;
+	pfe.severity = PF_EVENT_SEVERITY_CERTAIN_DOOM;
+	i40e_aq_send_msg_to_vf(hw, abs_vf_id, VIRTCHNL_OP_EVENT, 0, (u8 *)&pfe,
+			       sizeof(struct virtchnl_pf_event), NULL);
+}
+
+static int
+i40e_pf_host_process_cmd_request_queues(struct i40e_pf_vf *vf, uint8_t *msg)
+{
+	struct virtchnl_vf_res_request *vfres =
+		(struct virtchnl_vf_res_request *)msg;
+	struct i40e_pf *pf;
+	uint32_t req_pairs = vfres->num_queue_pairs;
+	uint32_t cur_pairs = vf->vsi->nb_used_qps;
+
+	pf = vf->pf;
+
+	if (req_pairs <= 0) {
+		PMD_DRV_LOG(ERR,
+			    "VF %d tried to request %d queues. Ignoring.\n",
+			    vf->vf_idx,
+			    I40E_MAX_QP_NUM_PER_VF);
+	} else if (req_pairs > I40E_MAX_QP_NUM_PER_VF) {
+		PMD_DRV_LOG(ERR,
+			    "VF %d tried to request more than %d queues.\n",
+			    vf->vf_idx,
+			    I40E_MAX_QP_NUM_PER_VF);
+		vfres->num_queue_pairs = I40E_MAX_QP_NUM_PER_VF;
+	} else if (req_pairs > cur_pairs + pf->qp_pool.num_free) {
+		PMD_DRV_LOG(ERR,
+			    "VF %d requested %d more queues, but noly %d left\n",
+			    vf->vf_idx,
+			    req_pairs - cur_pairs,
+			    pf->qp_pool.num_free);
+		vfres->num_queue_pairs = pf->qp_pool.num_free + cur_pairs;
+	} else {
+		i40e_vc_notify_vf_reset(vf);
+		vf->vsi->nb_qps = req_pairs;
+		pf->vf_nb_qps = req_pairs;
+		i40e_pf_host_process_cmd_reset_vf(vf);
+
+		return 0;
+	}
+
+	return i40e_pf_host_send_msg_to_vf(vf, VIRTCHNL_OP_REQUEST_QUEUES, 0,
+				(u8 *)vfres, sizeof(*vfres));
+}
+
 void
 i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,
 			   uint16_t abs_vf_id, uint32_t opcode,
@@ -1351,6 +1414,11 @@ i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,
 		PMD_DRV_LOG(INFO, "OP_CONFIG_RSS_KEY received");
 		i40e_pf_host_process_cmd_set_rss_key(vf, msg, msglen, b_op);
 		break;
+	case VIRTCHNL_OP_REQUEST_QUEUES:
+		PMD_DRV_LOG(INFO, "OP_REQUEST_QUEUES received");
+		i40e_pf_host_process_cmd_request_queues(vf, msg);
+		break;
+
 	/* Don't add command supported below, which will
 	 * return an error code.
 	 */
-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-dev] [PATCH v9 3/3] doc: update queue number per vf for i40e
  2018-12-20 11:01 [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhirun Yan
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 1/3] net/i40e: support VF " Zhirun Yan
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 2/3] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-20 11:01 ` Zhirun Yan
  2018-12-20 12:14 ` [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhang, Qi Z
  3 siblings, 0 replies; 5+ messages in thread
From: Zhirun Yan @ 2018-12-20 11:01 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

Updated the doc and release notes on the support for requesting more
queues.

Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
---
 doc/guides/nics/i40e.rst               | 15 +++++++++------
 doc/guides/rel_notes/release_19_02.rst |  8 ++++++++
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst
index bfacbd117..6aceb53ea 100644
--- a/doc/guides/nics/i40e.rst
+++ b/doc/guides/nics/i40e.rst
@@ -129,13 +129,16 @@ Please note that enabling debugging options may affect system performance.
 Runtime Config Options
 ~~~~~~~~~~~~~~~~~~~~~~
 
-- ``Number of Queues per VF`` (default ``4``)
+- ``Reserved number of Queues per VF`` (default ``4``)
+
+  The number of reserved queue per VF is determined by its host PF. If the
+  PCI address of an i40e PF is aaaa:bb.cc, the number of reserved queues per
+  VF can be configured with EAL parameter like -w aaaa:bb.cc,queue-num-per-vf=n.
+  The value n can be 1, 2, 4, 8 or 16. If no such parameter is configured, the
+  number of reserved queues per VF is 4 by default. If VF request more than
+  reserved queues per VF, PF will able to allocate max to 16 queues after a VF
+  reset.
 
-  The number of queue per VF is determined by its host PF. If the PCI address
-  of an i40e PF is aaaa:bb.cc, the number of queues per VF can be configured
-  with EAL parameter like -w aaaa:bb.cc,queue-num-per-vf=n. The value n can be
-  1, 2, 4, 8 or 16. If no such parameter is configured, the number of queues
-  per VF is 4 by default.
 
 - ``Support multiple driver`` (default ``disable``)
 
diff --git a/doc/guides/rel_notes/release_19_02.rst b/doc/guides/rel_notes/release_19_02.rst
index 069f429a7..fd5dc806b 100644
--- a/doc/guides/rel_notes/release_19_02.rst
+++ b/doc/guides/rel_notes/release_19_02.rst
@@ -65,6 +65,14 @@ New Features
   Added a new performance test tool to test the compressdev PMD. The tool tests
   compression ratio and compression throughput.
 
+* **Added dynamic queues allocation support for i40e VF.**
+
+  Previously, available queues of VF is reserved by PF at initialize stage.
+  Now both DPDK PF and Kernel PF (>=2.1.14) will support dynamic queue
+  allocation. At runtime, when VF request more queue number exceed the initial
+  reserved amount, PF can allocate up to 16 queues as the request after a VF
+  reset.
+
 
 Removed Items
 -------------
-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [dpdk-dev] [PATCH v9 0/3] Support request more queues
  2018-12-20 11:01 [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhirun Yan
                   ` (2 preceding siblings ...)
  2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 3/3] doc: update queue number per vf for i40e Zhirun Yan
@ 2018-12-20 12:14 ` Zhang, Qi Z
  3 siblings, 0 replies; 5+ messages in thread
From: Zhang, Qi Z @ 2018-12-20 12:14 UTC (permalink / raw)
  To: 20181219133743.57423-1-zhirun.yan, dev



> -----Original Message-----
> From: Yan, Zhirun
> Sent: Thursday, December 20, 2018 7:01 PM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: Yan, Zhirun <zhirun.yan@intel.com>
> Subject: [PATCH v9 0/3] Support request more queues
> 
> V9
> - Rebase to latest
> 
> DPDK VF send VIRTCHNL_OP_REQUEST_QUEUES to kernel PF or DPDK VF for
> requesting more queues, then PF will allocate more queues.
> 
> Zhirun Yan (3):
>   net/i40e: support VF request more queues
>   net/i40e: support PF respond VF request more queues
>   doc: update queue number per vf for i40e
> 
>  doc/guides/nics/i40e.rst               | 15 +++---
>  doc/guides/rel_notes/release_19_02.rst |  8 +++
>  drivers/net/i40e/i40e_ethdev_vf.c      | 65 +++++++++++++++++++++++-
>  drivers/net/i40e/i40e_pf.c             | 68 ++++++++++++++++++++++++++
>  4 files changed, 148 insertions(+), 8 deletions(-)
> 
> --
> 2.17.1


Acked-by: Qi Zhang <qi.z.zhang@intel.com>

v6 is reverted.
Applied to dpdk-next-net-intel.

Thanks
Qi

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-12-20 12:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-20 11:01 [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhirun Yan
2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 1/3] net/i40e: support VF " Zhirun Yan
2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 2/3] net/i40e: support PF respond " Zhirun Yan
2018-12-20 11:01 ` [dpdk-dev] [PATCH v9 3/3] doc: update queue number per vf for i40e Zhirun Yan
2018-12-20 12:14 ` [dpdk-dev] [PATCH v9 0/3] Support request more queues Zhang, Qi Z

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).