From patchwork Wed Nov 28 16:58:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yan, Zhirun" X-Patchwork-Id: 48363 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 23ED71B3F5; Wed, 28 Nov 2018 10:20:40 +0100 (CET) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id DB4741B3C0 for ; Wed, 28 Nov 2018 10:20:36 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Nov 2018 01:20:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,290,1539673200"; d="scan'208";a="116458916" Received: from dpdk-server.sh.intel.com ([10.67.110.151]) by fmsmga001.fm.intel.com with ESMTP; 28 Nov 2018 01:20:35 -0800 From: Zhirun Yan To: dev@dpdk.org, qi.z.zhang@intel.com, haiyue.wang@intel.com Cc: Zhirun Yan Date: Wed, 28 Nov 2018 16:58:05 +0000 Message-Id: <20181128165806.78934-2-zhirun.yan@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181128165806.78934-1-zhirun.yan@intel.com> References: <20181128165806.78934-1-zhirun.yan@intel.com> Subject: [dpdk-dev] [PATCH v2 1/2] net/i40e: support VF request more queues X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 Signed-off-by: Haiyue Wang --- 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); From patchwork Wed Nov 28 16:58:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yan, Zhirun" X-Patchwork-Id: 48364 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C96A91B426; Wed, 28 Nov 2018 10:20:42 +0100 (CET) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 81DA11B3EA for ; Wed, 28 Nov 2018 10:20:38 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Nov 2018 01:20:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,290,1539673200"; d="scan'208";a="116458926" Received: from dpdk-server.sh.intel.com ([10.67.110.151]) by fmsmga001.fm.intel.com with ESMTP; 28 Nov 2018 01:20:37 -0800 From: Zhirun Yan To: dev@dpdk.org, qi.z.zhang@intel.com, haiyue.wang@intel.com Cc: Zhirun Yan Date: Wed, 28 Nov 2018 16:58:06 +0000 Message-Id: <20181128165806.78934-3-zhirun.yan@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181128165806.78934-1-zhirun.yan@intel.com> References: <20181128165806.78934-1-zhirun.yan@intel.com> Subject: [dpdk-dev] [PATCH v2 2/2] net/i40e: support PF respond VF request more queues X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 Signed-off-by: Haiyue Wang --- 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. */