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

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 (2):
  net/i40e: support VF request more queues
  net/i40e: support PF respond VF request more queues

 drivers/net/i40e/i40e_ethdev_vf.c | 59 +++++++++++++++++++++++++--
 drivers/net/i40e/i40e_pf.c        | 67 +++++++++++++++++++++++++++++++
 2 files changed, 122 insertions(+), 4 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v2 1/2] net/i40e: support VF request more queues
  2018-11-28 16:58 [dpdk-dev] [PATCH v2 0/2] Support request more queues Zhirun Yan
@ 2018-11-28 16:58 ` Zhirun Yan
  2018-11-28 16:58 ` [dpdk-dev] [PATCH v2 2/2] net/i40e: support PF respond " Zhirun Yan
  2018-12-13 14:05 ` [dpdk-dev] [PATCH v3 0/2] Support " Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-11-28 16:58 UTC (permalink / raw)
  To: dev, qi.z.zhang, haiyue.wang; +Cc: Zhirun Yan

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 | 59 ++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index cecedc91f..551448bdb 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -343,6 +343,7 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct vf_cmd_info *args)
 		err = 0;
 		break;
 	case VIRTCHNL_OP_VERSION:
+	case VIRTCHNL_OP_REQUEST_QUEUES:
 	case VIRTCHNL_OP_GET_VF_RESOURCES:
 		/* for init adminq commands, need to poll the response */
 		err = -1;
@@ -350,8 +351,15 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct vf_cmd_info *args)
 			ret = i40evf_read_pfmsg(dev, &info);
 			vf->cmd_retval = info.result;
 			if (ret == I40EVF_MSG_CMD) {
-				err = 0;
+				if (info.ops != VIRTCHNL_OP_REQUEST_QUEUES)
+					err = 0;
 				break;
+			} else if (ret == I40EVF_MSG_SYS) {
+				if (args->ops == VIRTCHNL_OP_REQUEST_QUEUES &&
+					vf->vf_reset) {
+					err = 0;
+					break;
+				}
 			} else if (ret == I40EVF_MSG_ERR)
 				break;
 			rte_delay_ms(ASQ_DELAY_MS);
@@ -1012,6 +1020,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)
 {
@@ -1515,8 +1545,12 @@ 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);
+	int ret = 0;
 
 	/* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
 	 * allocation or vector Rx preconditions we will reset it.
@@ -1526,7 +1560,24 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
 	ad->tx_simple_allowed = true;
 	ad->tx_vec_allowed = true;
 
-	return i40evf_init_vlan(dev);
+	if (num_queue_pairs != vf->vsi_res->num_queue_pairs) {
+		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);
+		vf->vf_reset = false;
+		vf->pend_msg &= ~PFMSG_RESET_IMPENDING;
+
+		if (ret != 0)
+			return ret;
+	}
+
+	i40evf_init_vlan(dev);
+
+	return ret;
 }
 
 static int
@@ -2137,8 +2188,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] 39+ messages in thread

* [dpdk-dev] [PATCH v2 2/2] net/i40e: support PF respond VF request more queues
  2018-11-28 16:58 [dpdk-dev] [PATCH v2 0/2] Support request more queues Zhirun Yan
  2018-11-28 16:58 ` [dpdk-dev] [PATCH v2 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-11-28 16:58 ` Zhirun Yan
  2018-12-13 14:05 ` [dpdk-dev] [PATCH v3 0/2] Support " Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-11-28 16:58 UTC (permalink / raw)
  To: dev, qi.z.zhang, haiyue.wang; +Cc: Zhirun Yan

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 | 67 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..789a98dc7 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,68 @@ 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 +1413,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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF request more queues
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-12-13  8:26     ` David Marchand
  2018-12-14  3:17       ` Yan, Zhirun
  2018-12-13 10:49     ` Zhang, Qi Z
  1 sibling, 1 reply; 39+ messages in thread
From: David Marchand @ 2018-12-13  8:26 UTC (permalink / raw)
  To: zhirun.yan; +Cc: dev, qi.z.zhang, haiyue.wang

Hello, Zhirun,

On Thu, Dec 13, 2018 at 7:28 AM Zhirun Yan <zhirun.yan@intel.com> wrote:

> @@ -1515,8 +1545,12 @@ 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);
> +       int ret = 0;
>
>         /* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
>          * allocation or vector Rx preconditions we will reset it.
> @@ -1526,7 +1560,21 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
>         ad->tx_simple_allowed = true;
>         ad->tx_vec_allowed = true;
>
> -       return i40evf_init_vlan(dev);
> +       if (num_queue_pairs != vf->vsi_res->num_queue_pairs) {
> +               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;
> +       }
> +
> +       i40evf_init_vlan(dev);
> +
> +       return ret;
>  }
>
>  static int
>

Did not look too much into this code, but I noticed that with this change,
you always return 0, whatever happened with i40evf_init_vlan().
I would have put the "int ret" declaration in the new block and left the
return i40evf_init_vlan(dev); as is.

Do you have a rationale not to do so ?


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF request more queues
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF " Zhirun Yan
  2018-12-13  8:26     ` David Marchand
@ 2018-12-13 10:49     ` Zhang, Qi Z
  2018-12-14  3:22       ` Yan, Zhirun
  1 sibling, 1 reply; 39+ messages in thread
From: Zhang, Qi Z @ 2018-12-13 10:49 UTC (permalink / raw)
  To: Yan, Zhirun, dev; +Cc: Wang, Haiyue



> -----Original Message-----
> From: Yan, Zhirun
> Sent: Thursday, December 13, 2018 10:05 PM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: Yan, Zhirun <zhirun.yan@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Subject: [PATCH v3 1/2] net/i40e: support VF request more queues
> 
> 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 | 56 ++++++++++++++++++++++++++++---
>  1 file changed, 52 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index cecedc91f..50e3f1f4f 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -343,6 +343,7 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct
> vf_cmd_info *args)
>  		err = 0;
>  		break;
>  	case VIRTCHNL_OP_VERSION:
> +	case VIRTCHNL_OP_REQUEST_QUEUES:
>  	case VIRTCHNL_OP_GET_VF_RESOURCES:
>  		/* for init adminq commands, need to poll the response */
>  		err = -1;
> @@ -350,8 +351,15 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct
> vf_cmd_info *args)
>  			ret = i40evf_read_pfmsg(dev, &info);
>  			vf->cmd_retval = info.result;
>  			if (ret == I40EVF_MSG_CMD) {
> -				err = 0;
> +				if (info.ops != VIRTCHNL_OP_REQUEST_QUEUES)
> +					err = 0;
>  				break;
> +			} else if (ret == I40EVF_MSG_SYS) {
> +				if (args->ops == VIRTCHNL_OP_REQUEST_QUEUES &&

OK, for VIRTCHNL_OP_REQUEST_QUEUES, we will ignore async reply (I40EVF_MSG_CMD) but only wait for system message (I40EVF_MSG_SYS)
I think it's better to create new branch for case VIRTCHNL_OP_REQUEST_QUEUES to make code more readable.

> +					vf->vf_reset) {
> +					err = 0;
> +					break;
> +				}
>  			} else if (ret == I40EVF_MSG_ERR)
>  				break;
>  			rte_delay_ms(ASQ_DELAY_MS);

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

* [dpdk-dev] [PATCH v3 0/2] Support request more queues
  2018-11-28 16:58 [dpdk-dev] [PATCH v2 0/2] Support request more queues Zhirun Yan
  2018-11-28 16:58 ` [dpdk-dev] [PATCH v2 1/2] net/i40e: support VF " Zhirun Yan
  2018-11-28 16:58 ` [dpdk-dev] [PATCH v2 2/2] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-13 14:05 ` Zhirun Yan
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF " Zhirun Yan
                     ` (2 more replies)
  2 siblings, 3 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-13 14:05 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

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


V3:
- remove vf->reset and vf->pend_msg flag

Zhirun Yan (2):
  net/i40e: support VF request more queues
  net/i40e: support PF respond VF request more queues

 drivers/net/i40e/i40e_ethdev_vf.c | 56 ++++++++++++++++++++++++--
 drivers/net/i40e/i40e_pf.c        | 67 +++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+), 4 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF request more queues
  2018-12-13 14:05 ` [dpdk-dev] [PATCH v3 0/2] Support " Zhirun Yan
@ 2018-12-13 14:05   ` Zhirun Yan
  2018-12-13  8:26     ` David Marchand
  2018-12-13 10:49     ` Zhang, Qi Z
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 2/2] net/i40e: support PF respond " Zhirun Yan
  2018-12-14 14:37   ` [dpdk-dev] [PATCH v4 0/2] Support " Zhirun Yan
  2 siblings, 2 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-13 14:05 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 | 56 ++++++++++++++++++++++++++++---
 1 file changed, 52 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index cecedc91f..50e3f1f4f 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -343,6 +343,7 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct vf_cmd_info *args)
 		err = 0;
 		break;
 	case VIRTCHNL_OP_VERSION:
+	case VIRTCHNL_OP_REQUEST_QUEUES:
 	case VIRTCHNL_OP_GET_VF_RESOURCES:
 		/* for init adminq commands, need to poll the response */
 		err = -1;
@@ -350,8 +351,15 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct vf_cmd_info *args)
 			ret = i40evf_read_pfmsg(dev, &info);
 			vf->cmd_retval = info.result;
 			if (ret == I40EVF_MSG_CMD) {
-				err = 0;
+				if (info.ops != VIRTCHNL_OP_REQUEST_QUEUES)
+					err = 0;
 				break;
+			} else if (ret == I40EVF_MSG_SYS) {
+				if (args->ops == VIRTCHNL_OP_REQUEST_QUEUES &&
+					vf->vf_reset) {
+					err = 0;
+					break;
+				}
 			} else if (ret == I40EVF_MSG_ERR)
 				break;
 			rte_delay_ms(ASQ_DELAY_MS);
@@ -1012,6 +1020,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)
 {
@@ -1515,8 +1545,12 @@ 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);
+	int ret = 0;
 
 	/* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
 	 * allocation or vector Rx preconditions we will reset it.
@@ -1526,7 +1560,21 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
 	ad->tx_simple_allowed = true;
 	ad->tx_vec_allowed = true;
 
-	return i40evf_init_vlan(dev);
+	if (num_queue_pairs != vf->vsi_res->num_queue_pairs) {
+		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;
+	}
+
+	i40evf_init_vlan(dev);
+
+	return ret;
 }
 
 static int
@@ -2137,8 +2185,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] 39+ messages in thread

* [dpdk-dev] [PATCH v3 2/2] net/i40e: support PF respond VF request more queues
  2018-12-13 14:05 ` [dpdk-dev] [PATCH v3 0/2] Support " Zhirun Yan
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-12-13 14:05   ` Zhirun Yan
  2018-12-14 14:37   ` [dpdk-dev] [PATCH v4 0/2] Support " Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-13 14:05 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 | 67 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..789a98dc7 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,68 @@ 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 +1413,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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF request more queues
  2018-12-13  8:26     ` David Marchand
@ 2018-12-14  3:17       ` Yan, Zhirun
  0 siblings, 0 replies; 39+ messages in thread
From: Yan, Zhirun @ 2018-12-14  3:17 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Zhang, Qi Z, Wang, Haiyue

Hi David,

The i40evf_init_vlan() always returns 0. So the change doesn’t affect it.
I agree with you. So I will put the "int ret" declaration in the new block in next version.

Thanks.

From: David Marchand [mailto:david.marchand@redhat.com]
Sent: Thursday, December 13, 2018 4:26 PM
To: Yan, Zhirun <zhirun.yan@intel.com>
Cc: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
Subject: Re: [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF request more queues

Hello, Zhirun,

On Thu, Dec 13, 2018 at 7:28 AM Zhirun Yan <zhirun.yan@intel.com<mailto:zhirun.yan@intel.com>> wrote:
@@ -1515,8 +1545,12 @@ 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);
+       int ret = 0;

        /* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
         * allocation or vector Rx preconditions we will reset it.
@@ -1526,7 +1560,21 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
        ad->tx_simple_allowed = true;
        ad->tx_vec_allowed = true;

-       return i40evf_init_vlan(dev);
+       if (num_queue_pairs != vf->vsi_res->num_queue_pairs) {
+               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;
+       }
+
+       i40evf_init_vlan(dev);
+
+       return ret;
 }

 static int

Did not look too much into this code, but I noticed that with this change, you always return 0, whatever happened with i40evf_init_vlan().
I would have put the "int ret" declaration in the new block and left the return i40evf_init_vlan(dev); as is.
Do you have a rationale not to do so ?

--
David Marchand


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

* Re: [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF request more queues
  2018-12-13 10:49     ` Zhang, Qi Z
@ 2018-12-14  3:22       ` Yan, Zhirun
  0 siblings, 0 replies; 39+ messages in thread
From: Yan, Zhirun @ 2018-12-14  3:22 UTC (permalink / raw)
  To: Zhang, Qi Z, dev; +Cc: Wang, Haiyue

Hi Qi,

> -----Original Message-----
> From: Zhang, Qi Z
> Sent: Thursday, December 13, 2018 6:49 PM
> To: Yan, Zhirun <zhirun.yan@intel.com>; dev@dpdk.org
> Cc: Wang, Haiyue <haiyue.wang@intel.com>
> Subject: RE: [PATCH v3 1/2] net/i40e: support VF request more queues
> 
> 
> 
> > -----Original Message-----
> > From: Yan, Zhirun
> > Sent: Thursday, December 13, 2018 10:05 PM
> > To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> > Cc: Yan, Zhirun <zhirun.yan@intel.com>; Wang, Haiyue
> > <haiyue.wang@intel.com>
> > Subject: [PATCH v3 1/2] net/i40e: support VF request more queues
> >
> > 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 | 56
> > ++++++++++++++++++++++++++++---
> >  1 file changed, 52 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> > b/drivers/net/i40e/i40e_ethdev_vf.c
> > index cecedc91f..50e3f1f4f 100644
> > --- a/drivers/net/i40e/i40e_ethdev_vf.c
> > +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> > @@ -343,6 +343,7 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev,
> > struct vf_cmd_info *args)
> >  		err = 0;
> >  		break;
> >  	case VIRTCHNL_OP_VERSION:
> > +	case VIRTCHNL_OP_REQUEST_QUEUES:
> >  	case VIRTCHNL_OP_GET_VF_RESOURCES:
> >  		/* for init adminq commands, need to poll the response */
> >  		err = -1;
> > @@ -350,8 +351,15 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev,
> > struct vf_cmd_info *args)
> >  			ret = i40evf_read_pfmsg(dev, &info);
> >  			vf->cmd_retval = info.result;
> >  			if (ret == I40EVF_MSG_CMD) {
> > -				err = 0;
> > +				if (info.ops !=
> VIRTCHNL_OP_REQUEST_QUEUES)
> > +					err = 0;
> >  				break;
> > +			} else if (ret == I40EVF_MSG_SYS) {
> > +				if (args->ops ==
> VIRTCHNL_OP_REQUEST_QUEUES &&
> 
> OK, for VIRTCHNL_OP_REQUEST_QUEUES, we will ignore async reply
> (I40EVF_MSG_CMD) but only wait for system message (I40EVF_MSG_SYS) I
> think it's better to create new branch for case
> VIRTCHNL_OP_REQUEST_QUEUES to make code more readable.
> 

Yes, I will send a new version without it and create new patchs for handling msg from pf.

> > +					vf->vf_reset) {
> > +					err = 0;
> > +					break;
> > +				}
> >  			} else if (ret == I40EVF_MSG_ERR)
> >  				break;
> >  			rte_delay_ms(ASQ_DELAY_MS);

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

* Re: [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF request more queues
  2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-12-14 11:59       ` Zhang, Qi Z
  2018-12-17  3:12         ` Yan, Zhirun
  0 siblings, 1 reply; 39+ messages in thread
From: Zhang, Qi Z @ 2018-12-14 11:59 UTC (permalink / raw)
  To: Yan, Zhirun, dev; +Cc: Wang, Haiyue



> -----Original Message-----
> From: Yan, Zhirun
> Sent: Friday, December 14, 2018 10:37 PM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: Yan, Zhirun <zhirun.yan@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Subject: [PATCH v4 1/2] net/i40e: support VF request more queues
> 
> 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 | 62 ++++++++++++++++++++++++++++++-
>  1 file changed, 60 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index 05dc6596b..a568fb528 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -359,6 +359,25 @@ 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) {

Base on patch 2/2, in the case some error happen for example that no more free queue available, I40EVF_MSG_CMD will be returned. 
I think it should be "else if (ret == I40EVF_MSG_ERR || ret == I40EVF_MSG_CMD)" here
So we don't need to wait until end of loop in that case.
> +				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 +1031,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
> +1557,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 +1571,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 +2203,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] 39+ messages in thread

* [dpdk-dev] [PATCH v4 0/2] Support request more queues
  2018-12-13 14:05 ` [dpdk-dev] [PATCH v3 0/2] Support " Zhirun Yan
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF " Zhirun Yan
  2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 2/2] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-14 14:37   ` Zhirun Yan
  2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF " Zhirun Yan
                       ` (2 more replies)
  2 siblings, 3 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-14 14:37 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

V4
- create new branch for case VIRTCHNL_OP_REQUEST_QUEUES.
- put the "int ret" declaration in the new block and left the return
  i40evf_init_vlan(dev); as it is.
- fix some warning when start the application.

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 (2):
  net/i40e: support VF request more queues
  net/i40e: support PF respond VF request more queues

 drivers/net/i40e/i40e_ethdev_vf.c | 62 ++++++++++++++++++++++++++++-
 drivers/net/i40e/i40e_pf.c        | 65 +++++++++++++++++++++++++++++++
 2 files changed, 125 insertions(+), 2 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF request more queues
  2018-12-14 14:37   ` [dpdk-dev] [PATCH v4 0/2] Support " Zhirun Yan
@ 2018-12-14 14:37     ` Zhirun Yan
  2018-12-14 11:59       ` Zhang, Qi Z
  2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 2/2] net/i40e: support PF respond " Zhirun Yan
  2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
  2 siblings, 1 reply; 39+ messages in thread
From: Zhirun Yan @ 2018-12-14 14:37 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 | 62 ++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 05dc6596b..a568fb528 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -359,6 +359,25 @@ 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) {
+				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 +1031,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 +1557,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 +1571,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 +2203,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] 39+ messages in thread

* [dpdk-dev] [PATCH v4 2/2] net/i40e: support PF respond VF request more queues
  2018-12-14 14:37   ` [dpdk-dev] [PATCH v4 0/2] Support " Zhirun Yan
  2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-12-14 14:37     ` Zhirun Yan
  2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-14 14:37 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 | 65 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..da0e5d6c5 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,66 @@ 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 +1411,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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF request more queues
  2018-12-14 11:59       ` Zhang, Qi Z
@ 2018-12-17  3:12         ` Yan, Zhirun
  0 siblings, 0 replies; 39+ messages in thread
From: Yan, Zhirun @ 2018-12-17  3:12 UTC (permalink / raw)
  To: Zhang, Qi Z, dev; +Cc: Wang, Haiyue



> -----Original Message-----
> From: Zhang, Qi Z
> Sent: Friday, December 14, 2018 8:00 PM
> To: Yan, Zhirun <zhirun.yan@intel.com>; dev@dpdk.org
> Cc: Wang, Haiyue <haiyue.wang@intel.com>
> Subject: RE: [PATCH v4 1/2] net/i40e: support VF request more queues
> 
> 
> 
> > -----Original Message-----
> > From: Yan, Zhirun
> > Sent: Friday, December 14, 2018 10:37 PM
> > To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> > Cc: Yan, Zhirun <zhirun.yan@intel.com>; Wang, Haiyue
> > <haiyue.wang@intel.com>
> > Subject: [PATCH v4 1/2] net/i40e: support VF request more queues
> >
> > 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 | 62
> > ++++++++++++++++++++++++++++++-
> >  1 file changed, 60 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> > b/drivers/net/i40e/i40e_ethdev_vf.c
> > index 05dc6596b..a568fb528 100644
> > --- a/drivers/net/i40e/i40e_ethdev_vf.c
> > +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> > @@ -359,6 +359,25 @@ 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) {
> 
> Base on patch 2/2, in the case some error happen for example that no more
> free queue available, I40EVF_MSG_CMD will be returned.
> I think it should be "else if (ret == I40EVF_MSG_ERR || ret ==
> I40EVF_MSG_CMD)" here So we don't need to wait until end of loop in that
> case.

Yes,  I will modify it in the next version. Thanks.

> > +				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 +1031,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
> > +1557,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 +1571,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 +2203,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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v5 0/2] Support request more queues
  2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
@ 2018-12-17  5:31       ` Zhang, Qi Z
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF " Zhirun Yan
                         ` (2 subsequent siblings)
  3 siblings, 0 replies; 39+ messages in thread
From: Zhang, Qi Z @ 2018-12-17  5:31 UTC (permalink / raw)
  To: Yan, Zhirun, dev



> -----Original Message-----
> From: Yan, Zhirun
> Sent: Monday, December 17, 2018 7:11 PM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: Yan, Zhirun <zhirun.yan@intel.com>
> Subject: [PATCH v5 0/2] Support request more queues
> 
> V5
> -  modify the loop conditions (ret == I40EVF_MSG_ERR || ret ==
> I40EVF_MSG_CMD) if there is no free queue available, just end the loop.
> 
> 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 (2):
>   net/i40e: support VF request more queues
>   net/i40e: support PF respond VF request more queues
> 
>  drivers/net/i40e/i40e_ethdev_vf.c | 62 ++++++++++++++++++++++++++++-
>  drivers/net/i40e/i40e_pf.c        | 65
> +++++++++++++++++++++++++++++++
>  2 files changed, 125 insertions(+), 2 deletions(-)
> 
> --
> 2.17.1

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

Applied to dpdk-next-net-intel.

Thanks
Qi

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

* [dpdk-dev] [PATCH v5 0/2] Support request more queues
  2018-12-14 14:37   ` [dpdk-dev] [PATCH v4 0/2] Support " Zhirun Yan
  2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF " Zhirun Yan
  2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 2/2] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-17 11:10     ` Zhirun Yan
  2018-12-17  5:31       ` Zhang, Qi Z
                         ` (3 more replies)
  2 siblings, 4 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-17 11:10 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

V5
-  modify the loop conditions (ret == I40EVF_MSG_ERR || ret == I40EVF_MSG_CMD)
if there is no free queue available, just end the loop.

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 (2):
  net/i40e: support VF request more queues
  net/i40e: support PF respond VF request more queues

 drivers/net/i40e/i40e_ethdev_vf.c | 62 ++++++++++++++++++++++++++++-
 drivers/net/i40e/i40e_pf.c        | 65 +++++++++++++++++++++++++++++++
 2 files changed, 125 insertions(+), 2 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF request more queues
  2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
  2018-12-17  5:31       ` Zhang, Qi Z
@ 2018-12-17 11:10       ` Zhirun Yan
  2018-12-17 14:28         ` Ferruh Yigit
  2018-12-17 14:31         ` Ferruh Yigit
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 2/2] net/i40e: support PF respond " Zhirun Yan
  2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
  3 siblings, 2 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-17 11:10 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 | 62 ++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 05dc6596b..498e86649 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -359,6 +359,25 @@ 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 +1031,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 +1557,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 +1571,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 +2203,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] 39+ messages in thread

* [dpdk-dev] [PATCH v5 2/2] net/i40e: support PF respond VF request more queues
  2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
  2018-12-17  5:31       ` Zhang, Qi Z
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-12-17 11:10       ` Zhirun Yan
  2018-12-17 14:26         ` Ferruh Yigit
  2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
  3 siblings, 1 reply; 39+ messages in thread
From: Zhirun Yan @ 2018-12-17 11:10 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 | 65 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..da0e5d6c5 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,66 @@ 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 +1411,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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v5 2/2] net/i40e: support PF respond VF request more queues
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 2/2] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-17 14:26         ` Ferruh Yigit
  0 siblings, 0 replies; 39+ messages in thread
From: Ferruh Yigit @ 2018-12-17 14:26 UTC (permalink / raw)
  To: Zhirun Yan, dev, qi.z.zhang; +Cc: Haiyue Wang

On 12/17/2018 11:10 AM, Zhirun Yan wrote:
> 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.

Hi Zhirun,

Is this request supported by Linux kernel PF driver? If so which version?
Should we document this as a version dependency somewhere?

> 
> Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>

<...>

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

* Re: [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF request more queues
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF " Zhirun Yan
@ 2018-12-17 14:28         ` Ferruh Yigit
  2018-12-18  1:44           ` Zhang, Qi Z
  2018-12-17 14:31         ` Ferruh Yigit
  1 sibling, 1 reply; 39+ messages in thread
From: Ferruh Yigit @ 2018-12-17 14:28 UTC (permalink / raw)
  To: Zhirun Yan, dev, qi.z.zhang; +Cc: Haiyue Wang

On 12/17/2018 11:10 AM, Zhirun Yan wrote:
> 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.

Is this replaces "ETH_I40E_QUEUE_NUM_PER_VF_ARG (queue-num-per-vf)" devarg?
Should we remove this devarg?

> 
> Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>

<...>

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

* Re: [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF request more queues
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF " Zhirun Yan
  2018-12-17 14:28         ` Ferruh Yigit
@ 2018-12-17 14:31         ` Ferruh Yigit
  1 sibling, 0 replies; 39+ messages in thread
From: Ferruh Yigit @ 2018-12-17 14:31 UTC (permalink / raw)
  To: Zhirun Yan, dev, qi.z.zhang; +Cc: Haiyue Wang

On 12/17/2018 11:10 AM, Zhirun Yan wrote:
> 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>

<...>

> @@ -359,6 +359,25 @@ 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 */

Don't need comment terminators for each line, can have block comment, would you
mind if I fix while merging?

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

* Re: [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF request more queues
  2018-12-17 14:28         ` Ferruh Yigit
@ 2018-12-18  1:44           ` Zhang, Qi Z
  0 siblings, 0 replies; 39+ messages in thread
From: Zhang, Qi Z @ 2018-12-18  1:44 UTC (permalink / raw)
  To: Yigit, Ferruh, Yan, Zhirun, dev; +Cc: Wang, Haiyue



> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Monday, December 17, 2018 10:28 PM
> To: Yan, Zhirun <zhirun.yan@intel.com>; dev@dpdk.org; Zhang, Qi Z
> <qi.z.zhang@intel.com>
> Cc: Wang, Haiyue <haiyue.wang@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF request more
> queues
> 
> On 12/17/2018 11:10 AM, Zhirun Yan wrote:
> > 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.
> 
> Is this replaces "ETH_I40E_QUEUE_NUM_PER_VF_ARG (queue-num-per-vf)"
> devarg?
> Should we remove this devarg?

queue-num-per-vf is the reserved queue number by PF for VF, it fit the situation when fixed queue number is required, so I think we still can keep it.
but I think the document could be modified properly , since queue-num-per-vf is never be the upper boundary of the queue number per vf, 
pf still can allocate max to 16 queues to exceed, we can add this explanation.


> 
> >
> > Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> > Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
> 
> <...>


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

* Re: [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF request more queues
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF " Zhirun Yan
@ 2018-12-18 12:44           ` Zhang, Qi Z
  2018-12-19  1:34             ` Yan, Zhirun
  0 siblings, 1 reply; 39+ messages in thread
From: Zhang, Qi Z @ 2018-12-18 12:44 UTC (permalink / raw)
  To: Yan, Zhirun, dev; +Cc: Wang, Haiyue



> -----Original Message-----
> From: Yan, Zhirun
> Sent: Wednesday, December 19, 2018 12:10 AM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: Yan, Zhirun <zhirun.yan@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Subject: [PATCH v6 1/3] net/i40e: support VF request more queues
> 
> 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 | 62 ++++++++++++++++++++++++++++++-
>  1 file changed, 60 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index 05dc6596b..498e86649 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -359,6 +359,25 @@ 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 */

I think you forgot to fix the comment format as Ferruh mentioned previously


> +		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 +1031,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
> +1557,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 +1571,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 +2203,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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e Zhirun Yan
@ 2018-12-18 12:59           ` Zhang, Qi Z
  2018-12-19  1:33             ` Yan, Zhirun
  0 siblings, 1 reply; 39+ messages in thread
From: Zhang, Qi Z @ 2018-12-18 12:59 UTC (permalink / raw)
  To: Yan, Zhirun, dev



> -----Original Message-----
> From: Yan, Zhirun
> Sent: Wednesday, December 19, 2018 12:10 AM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: Yan, Zhirun <zhirun.yan@intel.com>
> Subject: [PATCH v6 3/3] doc: update queue number per vf for i40e
> 
> Updated the doc and release notes on the support for requesting more queues.

Please fix the warning due to exceed 75 chars

> 
> Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> ---
>  doc/guides/nics/i40e.rst               | 16 +++++++++-------
>  doc/guides/rel_notes/release_19_02.rst |  8 ++++++++
>  2 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst index
> bfacbd117..70143d6a0 100644
> --- a/doc/guides/nics/i40e.rst
> +++ b/doc/guides/nics/i40e.rst
> @@ -129,13 +129,15 @@ Please note that enabling debugging options may affect
> system performance.
>  Runtime Config Options
>  ~~~~~~~~~~~~~~~~~~~~~~
> 
> -- ``Number of Queues per VF`` (default ``4``)
> -
> -  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.
> +- ``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.
> 
>  - ``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 e86ef9511..f99443cfa 100644
> --- a/doc/guides/rel_notes/release_19_02.rst
> +++ b/doc/guides/rel_notes/release_19_02.rst
> @@ -60,6 +60,14 @@ New Features
>    * Added the handler to get firmware version string.
>    * Added support for multicast filtering.
> 
> +* **Support dynamic queues allocation for VF.**

I think you need to specify this is for i40e.

Base on previous release note. It's better to follow the style like "Added ..."
So It could be "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] 39+ messages in thread

* [dpdk-dev] [PATCH v6 0/3] Support request more queues
  2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
                         ` (2 preceding siblings ...)
  2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 2/2] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-18 16:09       ` Zhirun Yan
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF " Zhirun Yan
                           ` (3 more replies)
  3 siblings, 4 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-18 16:09 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

V6
- update release note and doc

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               | 16 ++++---
 doc/guides/rel_notes/release_19_02.rst |  8 ++++
 drivers/net/i40e/i40e_ethdev_vf.c      | 62 +++++++++++++++++++++++-
 drivers/net/i40e/i40e_pf.c             | 65 ++++++++++++++++++++++++++
 4 files changed, 142 insertions(+), 9 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF request more queues
  2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
@ 2018-12-18 16:09         ` Zhirun Yan
  2018-12-18 12:44           ` Zhang, Qi Z
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 2/3] net/i40e: support PF respond " Zhirun Yan
                           ` (2 subsequent siblings)
  3 siblings, 1 reply; 39+ messages in thread
From: Zhirun Yan @ 2018-12-18 16:09 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 | 62 ++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 05dc6596b..498e86649 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -359,6 +359,25 @@ 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 +1031,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 +1557,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 +1571,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 +2203,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] 39+ messages in thread

* [dpdk-dev] [PATCH v6 2/3] net/i40e: support PF respond VF request more queues
  2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF " Zhirun Yan
@ 2018-12-18 16:09         ` Zhirun Yan
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e Zhirun Yan
  2018-12-19 13:08         ` [dpdk-dev] [PATCH v7 0/3] Support request more queues Zhirun Yan
  3 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-18 16:09 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 | 65 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..da0e5d6c5 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,66 @@ 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 +1411,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] 39+ messages in thread

* [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e
  2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF " Zhirun Yan
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 2/3] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-18 16:09         ` Zhirun Yan
  2018-12-18 12:59           ` Zhang, Qi Z
  2018-12-19 13:08         ` [dpdk-dev] [PATCH v7 0/3] Support request more queues Zhirun Yan
  3 siblings, 1 reply; 39+ messages in thread
From: Zhirun Yan @ 2018-12-18 16:09 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               | 16 +++++++++-------
 doc/guides/rel_notes/release_19_02.rst |  8 ++++++++
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst
index bfacbd117..70143d6a0 100644
--- a/doc/guides/nics/i40e.rst
+++ b/doc/guides/nics/i40e.rst
@@ -129,13 +129,15 @@ Please note that enabling debugging options may affect system performance.
 Runtime Config Options
 ~~~~~~~~~~~~~~~~~~~~~~
 
-- ``Number of Queues per VF`` (default ``4``)
-
-  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.
+- ``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.
 
 - ``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 e86ef9511..f99443cfa 100644
--- a/doc/guides/rel_notes/release_19_02.rst
+++ b/doc/guides/rel_notes/release_19_02.rst
@@ -60,6 +60,14 @@ New Features
   * Added the handler to get firmware version string.
   * Added support for multicast filtering.
 
+* **Support dynamic queues allocation for 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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e
  2018-12-18 12:59           ` Zhang, Qi Z
@ 2018-12-19  1:33             ` Yan, Zhirun
  0 siblings, 0 replies; 39+ messages in thread
From: Yan, Zhirun @ 2018-12-19  1:33 UTC (permalink / raw)
  To: Zhang, Qi Z, dev



> -----Original Message-----
> From: Zhang, Qi Z
> Sent: Tuesday, December 18, 2018 9:00 PM
> To: Yan, Zhirun <zhirun.yan@intel.com>; dev@dpdk.org
> Subject: RE: [PATCH v6 3/3] doc: update queue number per vf for i40e
> 
> 
> 
> > -----Original Message-----
> > From: Yan, Zhirun
> > Sent: Wednesday, December 19, 2018 12:10 AM
> > To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> > Cc: Yan, Zhirun <zhirun.yan@intel.com>
> > Subject: [PATCH v6 3/3] doc: update queue number per vf for i40e
> >
> > Updated the doc and release notes on the support for requesting more
> queues.
> 
> Please fix the warning due to exceed 75 chars
> 
> >
> > Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> > ---
> >  doc/guides/nics/i40e.rst               | 16 +++++++++-------
> >  doc/guides/rel_notes/release_19_02.rst |  8 ++++++++
> >  2 files changed, 17 insertions(+), 7 deletions(-)
> >
> > diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst index
> > bfacbd117..70143d6a0 100644
> > --- a/doc/guides/nics/i40e.rst
> > +++ b/doc/guides/nics/i40e.rst
> > @@ -129,13 +129,15 @@ Please note that enabling debugging options may
> > affect system performance.
> >  Runtime Config Options
> >  ~~~~~~~~~~~~~~~~~~~~~~
> >
> > -- ``Number of Queues per VF`` (default ``4``)
> > -
> > -  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.
> > +- ``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.
> >
> >  - ``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 e86ef9511..f99443cfa 100644
> > --- a/doc/guides/rel_notes/release_19_02.rst
> > +++ b/doc/guides/rel_notes/release_19_02.rst
> > @@ -60,6 +60,14 @@ New Features
> >    * Added the handler to get firmware version string.
> >    * Added support for multicast filtering.
> >
> > +* **Support dynamic queues allocation for VF.**
> 
> I think you need to specify this is for i40e.
> 
> Base on previous release note. It's better to follow the style like "Added ..."
> So It could be "Added dynamic queues allocation support for i40e VF".
> 

Yes, I will modify it in next version.

> > +
> > +  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] 39+ messages in thread

* Re: [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF request more queues
  2018-12-18 12:44           ` Zhang, Qi Z
@ 2018-12-19  1:34             ` Yan, Zhirun
  0 siblings, 0 replies; 39+ messages in thread
From: Yan, Zhirun @ 2018-12-19  1:34 UTC (permalink / raw)
  To: Zhang, Qi Z, dev; +Cc: Wang, Haiyue



> -----Original Message-----
> From: Zhang, Qi Z
> Sent: Tuesday, December 18, 2018 8:44 PM
> To: Yan, Zhirun <zhirun.yan@intel.com>; dev@dpdk.org
> Cc: Wang, Haiyue <haiyue.wang@intel.com>
> Subject: RE: [PATCH v6 1/3] net/i40e: support VF request more queues
> 
> 
> 
> > -----Original Message-----
> > From: Yan, Zhirun
> > Sent: Wednesday, December 19, 2018 12:10 AM
> > To: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> > Cc: Yan, Zhirun <zhirun.yan@intel.com>; Wang, Haiyue
> > <haiyue.wang@intel.com>
> > Subject: [PATCH v6 1/3] net/i40e: support VF request more queues
> >
> > 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 | 62
> > ++++++++++++++++++++++++++++++-
> >  1 file changed, 60 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> > b/drivers/net/i40e/i40e_ethdev_vf.c
> > index 05dc6596b..498e86649 100644
> > --- a/drivers/net/i40e/i40e_ethdev_vf.c
> > +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> > @@ -359,6 +359,25 @@ 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 */
> 
> I think you forgot to fix the comment format as Ferruh mentioned previously
> 
Sorry, I will fix it in next version.

> 
> > +		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 +1031,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
> > +1557,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 +1571,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 +2203,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] 39+ messages in thread

* [dpdk-dev] [PATCH v7 0/3] Support request more queues
  2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
                           ` (2 preceding siblings ...)
  2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e Zhirun Yan
@ 2018-12-19 13:08         ` Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 1/3] net/i40e: support VF " Zhirun Yan
                             ` (2 more replies)
  3 siblings, 3 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:08 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

V7
- fix comment format
- fix commit msg warning due to exceed 75 chars
- modify doc to specify for i40e

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               | 16 ++---
 doc/guides/rel_notes/release_19_02.rst |  8 +++
 drivers/net/i40e/i40e_ethdev_vf.c      | 81 ++++++++++++++++++++++----
 drivers/net/i40e/i40e_pf.c             | 65 +++++++++++++++++++++
 4 files changed, 153 insertions(+), 17 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v7 1/3] net/i40e: support VF request more queues
  2018-12-19 13:08         ` [dpdk-dev] [PATCH v7 0/3] Support request more queues Zhirun Yan
@ 2018-12-19 13:08           ` Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 2/3] net/i40e: support PF respond " Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 3/3] doc: update queue number per vf for i40e Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:08 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 | 81 +++++++++++++++++++++++++++----
 1 file changed, 71 insertions(+), 10 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 05dc6596b..22d39a586 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)
 {
@@ -1109,14 +1153,14 @@ i40evf_reset_vf(struct i40e_hw *hw)
 		return -1;
 	}
 	/**
-	  * After issuing vf reset command to pf, pf won't necessarily
-	  * reset vf, it depends on what state it exactly is. If it's not
-	  * initialized yet, it won't have vf reset since it's in a certain
-	  * state. If not, it will try to reset. Even vf is reset, 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.
-	  */
+	 * After issuing vf reset command to pf, pf won't necessarily
+	 * reset vf, it depends on what state it exactly is. If it's not
+	 * initialized yet, it won't have vf reset since it's in a certain
+	 * state. If not, it will try to reset. Even vf is reset, 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(200);
 
 	ret = i40evf_check_vf_reset_done(hw);
@@ -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] 39+ messages in thread

* [dpdk-dev] [PATCH v7 2/3] net/i40e: support PF respond VF request more queues
  2018-12-19 13:08         ` [dpdk-dev] [PATCH v7 0/3] Support request more queues Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 1/3] net/i40e: support VF " Zhirun Yan
@ 2018-12-19 13:08           ` Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 3/3] doc: update queue number per vf for i40e Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:08 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 | 65 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c
index dd3962d38..7daa125ec 100644
--- a/drivers/net/i40e/i40e_pf.c
+++ b/drivers/net/i40e/i40e_pf.c
@@ -1218,6 +1218,66 @@ 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 +1411,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] 39+ messages in thread

* [dpdk-dev] [PATCH v7 3/3] doc: update queue number per vf for i40e
  2018-12-19 13:08         ` [dpdk-dev] [PATCH v7 0/3] Support request more queues Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 1/3] net/i40e: support VF " Zhirun Yan
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 2/3] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-19 13:08           ` Zhirun Yan
  2018-12-19 13:37             ` [dpdk-dev] [PATCH v8 0/3] Support request more queues Zhirun Yan
  2 siblings, 1 reply; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:08 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               | 16 +++++++++-------
 doc/guides/rel_notes/release_19_02.rst |  8 ++++++++
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst
index bfacbd117..70143d6a0 100644
--- a/doc/guides/nics/i40e.rst
+++ b/doc/guides/nics/i40e.rst
@@ -129,13 +129,15 @@ Please note that enabling debugging options may affect system performance.
 Runtime Config Options
 ~~~~~~~~~~~~~~~~~~~~~~
 
-- ``Number of Queues per VF`` (default ``4``)
-
-  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.
+- ``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.
 
 - ``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 8deb68b9a..524e731b2 100644
--- a/doc/guides/rel_notes/release_19_02.rst
+++ b/doc/guides/rel_notes/release_19_02.rst
@@ -60,6 +60,14 @@ New Features
   * Added the handler to get firmware version string.
   * Added support for multicast filtering.
 
+* **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] 39+ messages in thread

* [dpdk-dev] [PATCH v8 0/3] Support request more queues
  2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 3/3] doc: update queue number per vf for i40e Zhirun Yan
@ 2018-12-19 13:37             ` Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 1/3] net/i40e: support VF " Zhirun Yan
                                 ` (2 more replies)
  0 siblings, 3 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:37 UTC (permalink / raw)
  To: dev, qi.z.zhang; +Cc: Zhirun Yan

v8
- fix code style and compilation issues.

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               | 16 ++---
 doc/guides/rel_notes/release_19_02.rst |  8 +++
 drivers/net/i40e/i40e_ethdev_vf.c      | 81 ++++++++++++++++++++++----
 drivers/net/i40e/i40e_pf.c             | 68 +++++++++++++++++++++
 4 files changed, 156 insertions(+), 17 deletions(-)

-- 
2.17.1

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

* [dpdk-dev] [PATCH v8 1/3] net/i40e: support VF request more queues
  2018-12-19 13:37             ` [dpdk-dev] [PATCH v8 0/3] Support request more queues Zhirun Yan
@ 2018-12-19 13:37               ` Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 2/3] net/i40e: support PF respond " Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 3/3] doc: update queue number per vf for i40e Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:37 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 | 81 +++++++++++++++++++++++++++----
 1 file changed, 71 insertions(+), 10 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 05dc6596b..22d39a586 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)
 {
@@ -1109,14 +1153,14 @@ i40evf_reset_vf(struct i40e_hw *hw)
 		return -1;
 	}
 	/**
-	  * After issuing vf reset command to pf, pf won't necessarily
-	  * reset vf, it depends on what state it exactly is. If it's not
-	  * initialized yet, it won't have vf reset since it's in a certain
-	  * state. If not, it will try to reset. Even vf is reset, 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.
-	  */
+	 * After issuing vf reset command to pf, pf won't necessarily
+	 * reset vf, it depends on what state it exactly is. If it's not
+	 * initialized yet, it won't have vf reset since it's in a certain
+	 * state. If not, it will try to reset. Even vf is reset, 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(200);
 
 	ret = i40evf_check_vf_reset_done(hw);
@@ -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] 39+ messages in thread

* [dpdk-dev] [PATCH v8 2/3] net/i40e: support PF respond VF request more queues
  2018-12-19 13:37             ` [dpdk-dev] [PATCH v8 0/3] Support request more queues Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 1/3] net/i40e: support VF " Zhirun Yan
@ 2018-12-19 13:37               ` Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 3/3] doc: update queue number per vf for i40e Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:37 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] 39+ messages in thread

* [dpdk-dev] [PATCH v8 3/3] doc: update queue number per vf for i40e
  2018-12-19 13:37             ` [dpdk-dev] [PATCH v8 0/3] Support request more queues Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 1/3] net/i40e: support VF " Zhirun Yan
  2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 2/3] net/i40e: support PF respond " Zhirun Yan
@ 2018-12-19 13:37               ` Zhirun Yan
  2 siblings, 0 replies; 39+ messages in thread
From: Zhirun Yan @ 2018-12-19 13:37 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               | 16 +++++++++-------
 doc/guides/rel_notes/release_19_02.rst |  8 ++++++++
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst
index bfacbd117..70143d6a0 100644
--- a/doc/guides/nics/i40e.rst
+++ b/doc/guides/nics/i40e.rst
@@ -129,13 +129,15 @@ Please note that enabling debugging options may affect system performance.
 Runtime Config Options
 ~~~~~~~~~~~~~~~~~~~~~~
 
-- ``Number of Queues per VF`` (default ``4``)
-
-  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.
+- ``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.
 
 - ``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 8deb68b9a..524e731b2 100644
--- a/doc/guides/rel_notes/release_19_02.rst
+++ b/doc/guides/rel_notes/release_19_02.rst
@@ -60,6 +60,14 @@ New Features
   * Added the handler to get firmware version string.
   * Added support for multicast filtering.
 
+* **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] 39+ messages in thread

end of thread, other threads:[~2018-12-19  6:02 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-28 16:58 [dpdk-dev] [PATCH v2 0/2] Support request more queues Zhirun Yan
2018-11-28 16:58 ` [dpdk-dev] [PATCH v2 1/2] net/i40e: support VF " Zhirun Yan
2018-11-28 16:58 ` [dpdk-dev] [PATCH v2 2/2] net/i40e: support PF respond " Zhirun Yan
2018-12-13 14:05 ` [dpdk-dev] [PATCH v3 0/2] Support " Zhirun Yan
2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 1/2] net/i40e: support VF " Zhirun Yan
2018-12-13  8:26     ` David Marchand
2018-12-14  3:17       ` Yan, Zhirun
2018-12-13 10:49     ` Zhang, Qi Z
2018-12-14  3:22       ` Yan, Zhirun
2018-12-13 14:05   ` [dpdk-dev] [PATCH v3 2/2] net/i40e: support PF respond " Zhirun Yan
2018-12-14 14:37   ` [dpdk-dev] [PATCH v4 0/2] Support " Zhirun Yan
2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 1/2] net/i40e: support VF " Zhirun Yan
2018-12-14 11:59       ` Zhang, Qi Z
2018-12-17  3:12         ` Yan, Zhirun
2018-12-14 14:37     ` [dpdk-dev] [PATCH v4 2/2] net/i40e: support PF respond " Zhirun Yan
2018-12-17 11:10     ` [dpdk-dev] [PATCH v5 0/2] Support " Zhirun Yan
2018-12-17  5:31       ` Zhang, Qi Z
2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 1/2] net/i40e: support VF " Zhirun Yan
2018-12-17 14:28         ` Ferruh Yigit
2018-12-18  1:44           ` Zhang, Qi Z
2018-12-17 14:31         ` Ferruh Yigit
2018-12-17 11:10       ` [dpdk-dev] [PATCH v5 2/2] net/i40e: support PF respond " Zhirun Yan
2018-12-17 14:26         ` Ferruh Yigit
2018-12-18 16:09       ` [dpdk-dev] [PATCH v6 0/3] Support " Zhirun Yan
2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 1/3] net/i40e: support VF " Zhirun Yan
2018-12-18 12:44           ` Zhang, Qi Z
2018-12-19  1:34             ` Yan, Zhirun
2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 2/3] net/i40e: support PF respond " Zhirun Yan
2018-12-18 16:09         ` [dpdk-dev] [PATCH v6 3/3] doc: update queue number per vf for i40e Zhirun Yan
2018-12-18 12:59           ` Zhang, Qi Z
2018-12-19  1:33             ` Yan, Zhirun
2018-12-19 13:08         ` [dpdk-dev] [PATCH v7 0/3] Support request more queues Zhirun Yan
2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 1/3] net/i40e: support VF " Zhirun Yan
2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 2/3] net/i40e: support PF respond " Zhirun Yan
2018-12-19 13:08           ` [dpdk-dev] [PATCH v7 3/3] doc: update queue number per vf for i40e Zhirun Yan
2018-12-19 13:37             ` [dpdk-dev] [PATCH v8 0/3] Support request more queues Zhirun Yan
2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 1/3] net/i40e: support VF " Zhirun Yan
2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 2/3] net/i40e: support PF respond " Zhirun Yan
2018-12-19 13:37               ` [dpdk-dev] [PATCH v8 3/3] doc: update queue number per vf for i40e Zhirun Yan

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).