From patchwork Thu Dec 20 11:01:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yan, Zhirun" X-Patchwork-Id: 49162 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 46EDC1B95C; Thu, 20 Dec 2018 04:24:47 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id A993E1B930 for ; Thu, 20 Dec 2018 04:24:43 +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 orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Dec 2018 19:24:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,375,1539673200"; d="scan'208";a="131453976" Received: from dpdk-server.sh.intel.com ([10.67.110.170]) by fmsmga001.fm.intel.com with ESMTP; 19 Dec 2018 19:24:42 -0800 From: Zhirun Yan To: dev@dpdk.org, qi.z.zhang@intel.com Cc: Zhirun Yan , Haiyue Wang Date: Thu, 20 Dec 2018 11:01:29 +0000 Message-Id: <20181220110130.37913-3-zhirun.yan@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181220110130.37913-1-zhirun.yan@intel.com> References: <20181220110130.37913-1-zhirun.yan@intel.com> Subject: [dpdk-dev] [PATCH v9 2/3] net/i40e: support PF respond VF request more queues X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: 20181219133743.57423-1-zhirun.yan@intel.com 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 | 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. */