From patchwork Fri Jan 6 09:04:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 121656 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E89E1A00C2; Fri, 6 Jan 2023 10:28:01 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1363140A82; Fri, 6 Jan 2023 10:27:59 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 5E19F40691 for ; Fri, 6 Jan 2023 10:27:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672997277; x=1704533277; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gOByyArdEDxT/gs5aHJDc9H+ezIriLqr265JHCwHKD0=; b=ViZx6IvqQmIp4JfJXruTJ0UUCmBE0qnkIKmAMex5DOxEyOGkcsq3p9Ux GN8/pJuAI7bFIQTKZlkmdiE1YMMtV97qQnUTqdW4tkepavlnb3P6lC+3M JrShEppZ6StFn+AyKr0fB6s/kCEKDggM2gTOSHbPmiFLPJX8R5+4ln9Hu fP6rP3M+Y3r0fjDMWmIPVRp0QWdhpG8Djpcb+48/eDlS12RLfBUxXuyQO AiO5kEzpO4UHajdf27fuO0NJbLZjSzFj/ZfOCHQLhIn7+wD1mh+DX8I+r 1AeqlOsCLaexuMDL1Hb7VBTZZ+GER42GyBb7FV6FnuX1XCIH1/4GMx4Sm g==; X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="386893903" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="386893903" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jan 2023 01:27:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="655907965" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="655907965" Received: from dpdk-beileix-3.sh.intel.com ([10.67.110.253]) by orsmga002.jf.intel.com with ESMTP; 06 Jan 2023 01:27:55 -0800 From: beilei.xing@intel.com To: qi.z.zhang@intel.com Cc: dev@dpdk.org, Jingjing Wu , Beilei Xing Subject: [PATCH v2 1/5] net/idpf: remove vport req and recv info from adapter Date: Fri, 6 Jan 2023 09:04:57 +0000 Message-Id: <20230106090501.9106-2-beilei.xing@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20230106090501.9106-1-beilei.xing@intel.com> References: <20221208072725.32434-1-beilei.xing@intel.com> <20230106090501.9106-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jingjing Wu This patch refines idpf_adapter structure by removing vport request and receive info. Signed-off-by: Jingjing Wu Signed-off-by: Beilei Xing --- drivers/net/idpf/idpf_ethdev.c | 185 +++++++++++---------------------- drivers/net/idpf/idpf_ethdev.h | 19 ++-- drivers/net/idpf/idpf_vchnl.c | 18 +--- 3 files changed, 74 insertions(+), 148 deletions(-) diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c index 8b347631ce..d8b7b069cf 100644 --- a/drivers/net/idpf/idpf_ethdev.c +++ b/drivers/net/idpf/idpf_ethdev.c @@ -134,29 +134,11 @@ idpf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused) } static int -idpf_init_vport_req_info(struct rte_eth_dev *dev) +idpf_init_vport_req_info(struct rte_eth_dev *dev, + struct virtchnl2_create_vport *vport_info) { struct idpf_vport *vport = dev->data->dev_private; struct idpf_adapter *adapter = vport->adapter; - struct virtchnl2_create_vport *vport_info; - uint16_t idx = adapter->cur_vport_idx; - - if (idx == IDPF_INVALID_VPORT_IDX) { - PMD_INIT_LOG(ERR, "Invalid vport index."); - return -EINVAL; - } - - if (adapter->vport_req_info[idx] == NULL) { - adapter->vport_req_info[idx] = rte_zmalloc(NULL, - sizeof(struct virtchnl2_create_vport), 0); - if (adapter->vport_req_info[idx] == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate vport_req_info"); - return -ENOMEM; - } - } - - vport_info = - (struct virtchnl2_create_vport *)adapter->vport_req_info[idx]; vport_info->vport_type = rte_cpu_to_le_16(VIRTCHNL2_VPORT_TYPE_DEFAULT); if (adapter->txq_model == 0) { @@ -187,35 +169,13 @@ idpf_init_vport_req_info(struct rte_eth_dev *dev) return 0; } -static int -idpf_parse_devarg_id(char *name) -{ - uint16_t val; - char *p; - - p = strstr(name, "vport_"); - - if (p == NULL) - return -EINVAL; - - p += sizeof("vport_") - 1; - - val = strtoul(p, NULL, 10); - - return val; -} - #define IDPF_RSS_KEY_LEN 52 static int -idpf_init_vport(struct rte_eth_dev *dev) +idpf_init_vport(struct idpf_vport *vport) { - struct idpf_vport *vport = dev->data->dev_private; - struct idpf_adapter *adapter = vport->adapter; - uint16_t idx = adapter->cur_vport_idx; - struct virtchnl2_create_vport *vport_info = - (struct virtchnl2_create_vport *)adapter->vport_recv_info[idx]; - int i, type, ret; + struct virtchnl2_create_vport *vport_info = vport->vport_info; + int i, type; vport->vport_id = vport_info->vport_id; vport->txq_model = vport_info->txq_model; @@ -231,7 +191,6 @@ idpf_init_vport(struct rte_eth_dev *dev) vport->rss_key_size = RTE_MIN(IDPF_RSS_KEY_LEN, vport_info->rss_key_size); vport->rss_lut_size = vport_info->rss_lut_size; - vport->sw_idx = idx; for (i = 0; i < vport_info->chunks.num_chunks; i++) { type = vport_info->chunks.chunks[i].type; @@ -274,17 +233,6 @@ idpf_init_vport(struct rte_eth_dev *dev) } } - ret = idpf_parse_devarg_id(dev->data->name); - if (ret < 0) { - PMD_INIT_LOG(ERR, "Failed to parse devarg id."); - return -EINVAL; - } - vport->devarg_id = ret; - - vport->dev_data = dev->data; - - adapter->vports[idx] = vport; - return 0; } @@ -662,9 +610,10 @@ idpf_dev_close(struct rte_eth_dev *dev) vport->qv_map = NULL; adapter->cur_vports &= ~RTE_BIT32(vport->devarg_id); - - rte_free(vport); + adapter->cur_vport_nb--; dev->data->dev_private = NULL; + adapter->vports[vport->sw_idx] = NULL; + rte_free(vport); return 0; } @@ -757,10 +706,7 @@ parse_vport(const char *key, const char *value, void *args) } for (i = 0; i < adapter->req_vport_nb; i++) { - if ((adapter->cur_vports & RTE_BIT32(adapter->req_vports[i])) == 0) { - adapter->cur_vports |= RTE_BIT32(adapter->req_vports[i]); - adapter->cur_vport_nb++; - } else { + if (adapter->cur_vports & RTE_BIT32(adapter->req_vports[i])) { PMD_INIT_LOG(ERR, "Vport %d has been created", adapter->req_vports[i]); return -EINVAL; @@ -798,6 +744,8 @@ idpf_parse_devargs(struct rte_pci_device *pci_dev, struct idpf_adapter *adapter) struct rte_kvargs *kvlist; int ret; + adapter->req_vport_nb = 0; + if (devargs == NULL) return 0; @@ -981,26 +929,6 @@ idpf_adapter_init(struct rte_pci_device *pci_dev, struct idpf_adapter *adapter) adapter->max_vport_nb = adapter->caps->max_vports; - adapter->vport_req_info = rte_zmalloc("vport_req_info", - adapter->max_vport_nb * - sizeof(*adapter->vport_req_info), - 0); - if (adapter->vport_req_info == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate vport_req_info memory"); - ret = -ENOMEM; - goto err_caps; - } - - adapter->vport_recv_info = rte_zmalloc("vport_recv_info", - adapter->max_vport_nb * - sizeof(*adapter->vport_recv_info), - 0); - if (adapter->vport_recv_info == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate vport_recv_info memory"); - ret = -ENOMEM; - goto err_vport_recv_info; - } - adapter->vports = rte_zmalloc("vports", adapter->max_vport_nb * sizeof(*adapter->vports), @@ -1026,11 +954,6 @@ idpf_adapter_init(struct rte_pci_device *pci_dev, struct idpf_adapter *adapter) return ret; err_vports: - rte_free(adapter->vport_recv_info); - adapter->vport_recv_info = NULL; -err_vport_recv_info: - rte_free(adapter->vport_req_info); - adapter->vport_req_info = NULL; err_caps: rte_free(adapter->caps); adapter->caps = NULL; @@ -1063,17 +986,17 @@ static const struct eth_dev_ops idpf_eth_dev_ops = { }; static uint16_t -idpf_get_vport_idx(struct idpf_vport **vports, uint16_t max_vport_nb) +idpf_vport_idx_alloc(struct idpf_adapter *ad) { uint16_t vport_idx; uint16_t i; - for (i = 0; i < max_vport_nb; i++) { - if (vports[i] == NULL) + for (i = 0; i < ad->max_vport_nb; i++) { + if (ad->vports[i] == NULL) break; } - if (i == max_vport_nb) + if (i == ad->max_vport_nb) vport_idx = IDPF_INVALID_VPORT_IDX; else vport_idx = i; @@ -1082,35 +1005,50 @@ idpf_get_vport_idx(struct idpf_vport **vports, uint16_t max_vport_nb) } static int -idpf_dev_init(struct rte_eth_dev *dev, void *init_params) +idpf_dev_vport_init(struct rte_eth_dev *dev, void *init_params) { struct idpf_vport *vport = dev->data->dev_private; - struct idpf_adapter *adapter = init_params; + struct idpf_vport_param *param = init_params; + struct idpf_adapter *adapter = param->adapter; + /* for sending create vport virtchnl msg prepare */ + struct virtchnl2_create_vport vport_req_info; int ret = 0; dev->dev_ops = &idpf_eth_dev_ops; vport->adapter = adapter; + vport->sw_idx = param->idx; + vport->devarg_id = param->devarg_id; + + vport->vport_info = rte_zmalloc(NULL, IDPF_DFLT_MBX_BUF_SIZE, 0); + if (vport->vport_info == NULL) { + PMD_INIT_LOG(ERR, "Failed to allocate vport_info"); + ret = -ENOMEM; + goto err; + } - ret = idpf_init_vport_req_info(dev); + memset(&vport_req_info, 0, sizeof(vport_req_info)); + ret = idpf_init_vport_req_info(dev, &vport_req_info); if (ret != 0) { PMD_INIT_LOG(ERR, "Failed to init vport req_info."); goto err; } - ret = idpf_vc_create_vport(adapter); + ret = idpf_vc_create_vport(vport, &vport_req_info); if (ret != 0) { PMD_INIT_LOG(ERR, "Failed to create vport."); goto err_create_vport; } - ret = idpf_init_vport(dev); + ret = idpf_init_vport(vport); if (ret != 0) { PMD_INIT_LOG(ERR, "Failed to init vports."); goto err_init_vport; } - adapter->cur_vport_idx = idpf_get_vport_idx(adapter->vports, - adapter->max_vport_nb); + vport->dev_data = dev->data; + adapter->vports[param->idx] = vport; + adapter->cur_vports |= RTE_BIT32(param->devarg_id); + adapter->cur_vport_nb++; dev->data->mac_addrs = rte_zmalloc(NULL, RTE_ETHER_ADDR_LEN, 0); if (dev->data->mac_addrs == NULL) { @@ -1125,9 +1063,10 @@ idpf_dev_init(struct rte_eth_dev *dev, void *init_params) return 0; err_init_vport: + adapter->vports[param->idx] = NULL; /* reset */ idpf_vc_destroy_vport(vport); err_create_vport: - rte_free(vport->adapter->vport_req_info[vport->adapter->cur_vport_idx]); + rte_free(vport->vport_info); err: return ret; } @@ -1165,7 +1104,6 @@ static void idpf_adapter_rel(struct idpf_adapter *adapter) { struct idpf_hw *hw = &adapter->hw; - int i; idpf_ctlq_deinit(hw); @@ -1175,24 +1113,6 @@ idpf_adapter_rel(struct idpf_adapter *adapter) rte_free(adapter->mbx_resp); adapter->mbx_resp = NULL; - if (adapter->vport_req_info != NULL) { - for (i = 0; i < adapter->max_vport_nb; i++) { - rte_free(adapter->vport_req_info[i]); - adapter->vport_req_info[i] = NULL; - } - rte_free(adapter->vport_req_info); - adapter->vport_req_info = NULL; - } - - if (adapter->vport_recv_info != NULL) { - for (i = 0; i < adapter->max_vport_nb; i++) { - rte_free(adapter->vport_recv_info[i]); - adapter->vport_recv_info[i] = NULL; - } - rte_free(adapter->vport_recv_info); - adapter->vport_recv_info = NULL; - } - rte_free(adapter->vports); adapter->vports = NULL; } @@ -1201,6 +1121,7 @@ static int idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev) { + struct idpf_vport_param vport_param; struct idpf_adapter *adapter; char name[RTE_ETH_NAME_MAX_LEN]; int i, retval; @@ -1241,28 +1162,40 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, if (adapter->req_vport_nb == 0) { /* If no vport devarg, create vport 0 by default. */ + vport_param.adapter = adapter; + vport_param.devarg_id = 0; + vport_param.idx = idpf_vport_idx_alloc(adapter); + if (vport_param.idx == IDPF_INVALID_VPORT_IDX) { + PMD_INIT_LOG(ERR, "No space for vport %u", vport_param.devarg_id); + return 0; + } snprintf(name, sizeof(name), "idpf_%s_vport_0", pci_dev->device.name); retval = rte_eth_dev_create(&pci_dev->device, name, sizeof(struct idpf_vport), - NULL, NULL, idpf_dev_init, - adapter); + NULL, NULL, idpf_dev_vport_init, + &vport_param); if (retval != 0) PMD_DRV_LOG(ERR, "Failed to create default vport 0"); - adapter->cur_vports |= RTE_BIT32(0); - adapter->cur_vport_nb++; } else { for (i = 0; i < adapter->req_vport_nb; i++) { + vport_param.adapter = adapter; + vport_param.devarg_id = adapter->req_vports[i]; + vport_param.idx = idpf_vport_idx_alloc(adapter); + if (vport_param.idx == IDPF_INVALID_VPORT_IDX) { + PMD_INIT_LOG(ERR, "No space for vport %u", vport_param.devarg_id); + break; + } snprintf(name, sizeof(name), "idpf_%s_vport_%d", pci_dev->device.name, adapter->req_vports[i]); retval = rte_eth_dev_create(&pci_dev->device, name, sizeof(struct idpf_vport), - NULL, NULL, idpf_dev_init, - adapter); + NULL, NULL, idpf_dev_vport_init, + &vport_param); if (retval != 0) PMD_DRV_LOG(ERR, "Failed to create vport %d", - adapter->req_vports[i]); + vport_param.devarg_id); } } diff --git a/drivers/net/idpf/idpf_ethdev.h b/drivers/net/idpf/idpf_ethdev.h index 991677c3bc..c236cc8f16 100644 --- a/drivers/net/idpf/idpf_ethdev.h +++ b/drivers/net/idpf/idpf_ethdev.h @@ -89,8 +89,16 @@ struct idpf_chunks_info { uint32_t rx_buf_qtail_spacing; }; +struct idpf_vport_param { + struct idpf_adapter *adapter; + uint16_t devarg_id; /* arg id from user */ + uint16_t idx; /* index in adapter->vports[]*/ +}; + struct idpf_vport { struct idpf_adapter *adapter; /* Backreference to associated adapter */ + struct virtchnl2_create_vport *vport_info; /* virtchnl response info handling */ + uint16_t sw_idx; /* SW index in adapter->vports[]*/ uint16_t vport_id; uint32_t txq_model; uint32_t rxq_model; @@ -108,8 +116,6 @@ struct idpf_vport { uint16_t rss_key_size; uint16_t rss_lut_size; - uint16_t sw_idx; /* SW idx */ - struct rte_eth_dev_data *dev_data; /* Pointer to the device data */ uint16_t max_pkt_len; /* Maximum packet length */ @@ -146,16 +152,12 @@ struct idpf_adapter { uint32_t txq_model; /* 0 - split queue model, non-0 - single queue model */ uint32_t rxq_model; /* 0 - split queue model, non-0 - single queue model */ - /* Vport info */ - uint8_t **vport_req_info; - uint8_t **vport_recv_info; struct idpf_vport **vports; uint16_t max_vport_nb; uint16_t req_vports[IDPF_MAX_VPORT_NUM]; uint16_t req_vport_nb; - uint16_t cur_vports; + uint16_t cur_vports; /* bit mask of created vport */ uint16_t cur_vport_nb; - uint16_t cur_vport_idx; uint16_t used_vecs_num; @@ -231,7 +233,8 @@ void idpf_handle_virtchnl_msg(struct rte_eth_dev *dev); int idpf_vc_check_api_version(struct idpf_adapter *adapter); int idpf_get_pkt_type(struct idpf_adapter *adapter); int idpf_vc_get_caps(struct idpf_adapter *adapter); -int idpf_vc_create_vport(struct idpf_adapter *adapter); +int idpf_vc_create_vport(struct idpf_vport *vport, + struct virtchnl2_create_vport *vport_info); int idpf_vc_destroy_vport(struct idpf_vport *vport); int idpf_vc_set_rss_key(struct idpf_vport *vport); int idpf_vc_set_rss_lut(struct idpf_vport *vport); diff --git a/drivers/net/idpf/idpf_vchnl.c b/drivers/net/idpf/idpf_vchnl.c index ac6486d4ef..14b34619af 100644 --- a/drivers/net/idpf/idpf_vchnl.c +++ b/drivers/net/idpf/idpf_vchnl.c @@ -583,11 +583,10 @@ idpf_vc_get_caps(struct idpf_adapter *adapter) } int -idpf_vc_create_vport(struct idpf_adapter *adapter) +idpf_vc_create_vport(struct idpf_vport *vport, + struct virtchnl2_create_vport *vport_req_info) { - uint16_t idx = adapter->cur_vport_idx; - struct virtchnl2_create_vport *vport_req_info = - (struct virtchnl2_create_vport *)adapter->vport_req_info[idx]; + struct idpf_adapter *adapter = vport->adapter; struct virtchnl2_create_vport vport_msg; struct idpf_cmd_info args; int err = -1; @@ -615,16 +614,7 @@ idpf_vc_create_vport(struct idpf_adapter *adapter) return err; } - if (adapter->vport_recv_info[idx] == NULL) { - adapter->vport_recv_info[idx] = rte_zmalloc(NULL, - IDPF_DFLT_MBX_BUF_SIZE, 0); - if (adapter->vport_recv_info[idx] == NULL) { - PMD_INIT_LOG(ERR, "Failed to alloc vport_recv_info."); - return -ENOMEM; - } - } - rte_memcpy(adapter->vport_recv_info[idx], args.out_buffer, - IDPF_DFLT_MBX_BUF_SIZE); + rte_memcpy(vport->vport_info, args.out_buffer, IDPF_DFLT_MBX_BUF_SIZE); return 0; } From patchwork Fri Jan 6 09:04:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 121657 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6DA95A00C2; Fri, 6 Jan 2023 10:28:09 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5013940691; Fri, 6 Jan 2023 10:28:01 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 1F37140DFF for ; Fri, 6 Jan 2023 10:27:58 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672997279; x=1704533279; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NgdYnQu+hOZgcw9QwzN7SI7Mdg9LmWvEnmIcfEOpVP0=; b=TBz6EziD1J8mJW5MNKZh2bEQfOV7FNBpNC3A1Czio2ckDlaf+qEtExsO 1df1eJDoIgnsXRzCiIB71Id1dDGOuLI/EOvqyDvLgq5jVpiyq5kUu14bY gumZIaeB3K9zMOkj5Ba70yzpHb5BJlmDmQyM3RZX3i03VHuPCIUj4vzLl 8eR48SCYQS+GeBt8PFZRQ85dvZuvgnzJQcakXk/mXjadtLrvbGX7OIOZA FokgAlpOv5nh9dMNGHwCU5GI2EGD1hhHqoQZYFTIPiIZt/k5Qkiz9e7rg Rrd0Pi5abIz9gq3hp4gSRH7rMTHY/mQy/CZkJccBekJ25wkIEFYp176Y2 A==; X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="386893909" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="386893909" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jan 2023 01:27:58 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="655907974" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="655907974" Received: from dpdk-beileix-3.sh.intel.com ([10.67.110.253]) by orsmga002.jf.intel.com with ESMTP; 06 Jan 2023 01:27:57 -0800 From: beilei.xing@intel.com To: qi.z.zhang@intel.com Cc: dev@dpdk.org, Jingjing Wu , Beilei Xing Subject: [PATCH v2 2/5] net/idpf: remove req vports from adapter Date: Fri, 6 Jan 2023 09:04:58 +0000 Message-Id: <20230106090501.9106-3-beilei.xing@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20230106090501.9106-1-beilei.xing@intel.com> References: <20221208072725.32434-1-beilei.xing@intel.com> <20230106090501.9106-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jingjing Wu This patch refines idpf_adapter structure by removing req_vports. Signed-off-by: Jingjing Wu Signed-off-by: Beilei Xing --- drivers/net/idpf/idpf_ethdev.c | 79 ++++++++++++++++++---------------- drivers/net/idpf/idpf_ethdev.h | 9 +++- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c index d8b7b069cf..f7b3f8f515 100644 --- a/drivers/net/idpf/idpf_ethdev.c +++ b/drivers/net/idpf/idpf_ethdev.c @@ -619,29 +619,30 @@ idpf_dev_close(struct rte_eth_dev *dev) } static int -insert_value(struct idpf_adapter *adapter, uint16_t id) +insert_value(struct idpf_devargs *devargs, uint16_t id) { uint16_t i; - for (i = 0; i < adapter->req_vport_nb; i++) { - if (adapter->req_vports[i] == id) + /* ignore duplicate */ + for (i = 0; i < devargs->req_vport_nb; i++) { + if (devargs->req_vports[i] == id) return 0; } - if (adapter->req_vport_nb >= RTE_DIM(adapter->req_vports)) { + if (devargs->req_vport_nb >= RTE_DIM(devargs->req_vports)) { PMD_INIT_LOG(ERR, "Total vport number can't be > %d", IDPF_MAX_VPORT_NUM); return -EINVAL; } - adapter->req_vports[adapter->req_vport_nb] = id; - adapter->req_vport_nb++; + devargs->req_vports[devargs->req_vport_nb] = id; + devargs->req_vport_nb++; return 0; } static const char * -parse_range(const char *value, struct idpf_adapter *adapter) +parse_range(const char *value, struct idpf_devargs *devargs) { uint16_t lo, hi, i; int n = 0; @@ -652,13 +653,13 @@ parse_range(const char *value, struct idpf_adapter *adapter) if (result == 1) { if (lo >= IDPF_MAX_VPORT_NUM) return NULL; - if (insert_value(adapter, lo) != 0) + if (insert_value(devargs, lo) != 0) return NULL; } else if (result == 2) { if (lo > hi || hi >= IDPF_MAX_VPORT_NUM) return NULL; for (i = lo; i <= hi; i++) { - if (insert_value(adapter, i) != 0) + if (insert_value(devargs, i) != 0) return NULL; } } else { @@ -671,17 +672,16 @@ parse_range(const char *value, struct idpf_adapter *adapter) static int parse_vport(const char *key, const char *value, void *args) { - struct idpf_adapter *adapter = args; + struct idpf_devargs *devargs = args; const char *pos = value; - int i; - adapter->req_vport_nb = 0; + devargs->req_vport_nb = 0; if (*pos == '[') pos++; while (1) { - pos = parse_range(pos, adapter); + pos = parse_range(pos, devargs); if (pos == NULL) { PMD_INIT_LOG(ERR, "invalid value:\"%s\" for key:\"%s\", ", value, key); @@ -698,21 +698,6 @@ parse_vport(const char *key, const char *value, void *args) return -EINVAL; } - if (adapter->cur_vport_nb + adapter->req_vport_nb > - IDPF_MAX_VPORT_NUM) { - PMD_INIT_LOG(ERR, "Total vport number can't be > %d", - IDPF_MAX_VPORT_NUM); - return -EINVAL; - } - - for (i = 0; i < adapter->req_vport_nb; i++) { - if (adapter->cur_vports & RTE_BIT32(adapter->req_vports[i])) { - PMD_INIT_LOG(ERR, "Vport %d has been created", - adapter->req_vports[i]); - return -EINVAL; - } - } - return 0; } @@ -738,13 +723,14 @@ parse_bool(const char *key, const char *value, void *args) } static int -idpf_parse_devargs(struct rte_pci_device *pci_dev, struct idpf_adapter *adapter) +idpf_parse_devargs(struct rte_pci_device *pci_dev, struct idpf_adapter *adapter, + struct idpf_devargs *idpf_args) { struct rte_devargs *devargs = pci_dev->device.devargs; struct rte_kvargs *kvlist; - int ret; + int i, ret; - adapter->req_vport_nb = 0; + idpf_args->req_vport_nb = 0; if (devargs == NULL) return 0; @@ -755,8 +741,26 @@ idpf_parse_devargs(struct rte_pci_device *pci_dev, struct idpf_adapter *adapter) return -EINVAL; } + /* check parsed devargs */ + if (adapter->cur_vport_nb + idpf_args->req_vport_nb > + IDPF_MAX_VPORT_NUM) { + PMD_INIT_LOG(ERR, "Total vport number can't be > %d", + IDPF_MAX_VPORT_NUM); + ret = -EINVAL; + goto bail; + } + + for (i = 0; i < idpf_args->req_vport_nb; i++) { + if (adapter->cur_vports & RTE_BIT32(idpf_args->req_vports[i])) { + PMD_INIT_LOG(ERR, "Vport %d has been created", + idpf_args->req_vports[i]); + ret = -EINVAL; + goto bail; + } + } + ret = rte_kvargs_process(kvlist, IDPF_VPORT, &parse_vport, - adapter); + idpf_args); if (ret != 0) goto bail; @@ -1123,6 +1127,7 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, { struct idpf_vport_param vport_param; struct idpf_adapter *adapter; + struct idpf_devargs devargs; char name[RTE_ETH_NAME_MAX_LEN]; int i, retval; bool first_probe = false; @@ -1154,13 +1159,13 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, rte_spinlock_unlock(&idpf_adapter_lock); } - retval = idpf_parse_devargs(pci_dev, adapter); + retval = idpf_parse_devargs(pci_dev, adapter, &devargs); if (retval != 0) { PMD_INIT_LOG(ERR, "Failed to parse private devargs"); goto err; } - if (adapter->req_vport_nb == 0) { + if (devargs.req_vport_nb == 0) { /* If no vport devarg, create vport 0 by default. */ vport_param.adapter = adapter; vport_param.devarg_id = 0; @@ -1178,9 +1183,9 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, if (retval != 0) PMD_DRV_LOG(ERR, "Failed to create default vport 0"); } else { - for (i = 0; i < adapter->req_vport_nb; i++) { + for (i = 0; i < devargs.req_vport_nb; i++) { vport_param.adapter = adapter; - vport_param.devarg_id = adapter->req_vports[i]; + vport_param.devarg_id = devargs.req_vports[i]; vport_param.idx = idpf_vport_idx_alloc(adapter); if (vport_param.idx == IDPF_INVALID_VPORT_IDX) { PMD_INIT_LOG(ERR, "No space for vport %u", vport_param.devarg_id); @@ -1188,7 +1193,7 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, } snprintf(name, sizeof(name), "idpf_%s_vport_%d", pci_dev->device.name, - adapter->req_vports[i]); + devargs.req_vports[i]); retval = rte_eth_dev_create(&pci_dev->device, name, sizeof(struct idpf_vport), NULL, NULL, idpf_dev_vport_init, diff --git a/drivers/net/idpf/idpf_ethdev.h b/drivers/net/idpf/idpf_ethdev.h index c236cc8f16..bf37d5184c 100644 --- a/drivers/net/idpf/idpf_ethdev.h +++ b/drivers/net/idpf/idpf_ethdev.h @@ -137,6 +137,12 @@ struct idpf_vport { bool stopped; }; +/* Struct used when parse driver specific devargs */ +struct idpf_devargs { + uint16_t req_vports[IDPF_MAX_VPORT_NUM]; + uint16_t req_vport_nb; +}; + struct idpf_adapter { TAILQ_ENTRY(idpf_adapter) next; struct idpf_hw hw; @@ -154,8 +160,7 @@ struct idpf_adapter { struct idpf_vport **vports; uint16_t max_vport_nb; - uint16_t req_vports[IDPF_MAX_VPORT_NUM]; - uint16_t req_vport_nb; + uint16_t cur_vports; /* bit mask of created vport */ uint16_t cur_vport_nb; From patchwork Fri Jan 6 09:04:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 121658 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BB4D3A00C2; Fri, 6 Jan 2023 10:28:14 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3CFA842D2A; Fri, 6 Jan 2023 10:28:03 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 2D48A42D26; Fri, 6 Jan 2023 10:28:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672997281; x=1704533281; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mlKaZuJJrjek7S2PDcZX2JhpxPZdS0ONsWt6mT36Hfg=; b=ZzXpKrOKQBVmoyW2Ygbof+YSE97xehfU5t3C237J60tAvWZFU9M8D4kE V6qMkWBC31iMO4JqFZeoT2r6rfb/EJjzK/Hhxz40+M67w9fuvSVam0WvB +PKWGtC5xXXCG38pyFtUkjF9n5zoVQkdFT9JiuWiIQhRdJK7uOoGhbCSB dfKRR7hhXKSKauc1iu9HUxxopxLoQxF7TOju4v6YaGegWOl2YgEyE0rNn /bPZNrY6Imb1AVp5YFrj7W4F/nSCG4rtj02VAjRp3zvWvCPFK1jnYNDpY rJli8hh+XbYA6pgxCfc4GWqpT5ruv4Mi4YugjJkWANP7boHNmzMxKr90Y g==; X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="386893914" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="386893914" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jan 2023 01:28:00 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="655907979" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="655907979" Received: from dpdk-beileix-3.sh.intel.com ([10.67.110.253]) by orsmga002.jf.intel.com with ESMTP; 06 Jan 2023 01:27:58 -0800 From: beilei.xing@intel.com To: qi.z.zhang@intel.com Cc: dev@dpdk.org, Jingjing Wu , stable@dpdk.org, Beilei Xing Subject: [PATCH v2 3/5] net/idpf: fix splitq xmit free Date: Fri, 6 Jan 2023 09:04:59 +0000 Message-Id: <20230106090501.9106-4-beilei.xing@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20230106090501.9106-1-beilei.xing@intel.com> References: <20221208072725.32434-1-beilei.xing@intel.com> <20230106090501.9106-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jingjing Wu When context descriptor is used during sending packets, mbuf is not freed correctly, it will cause mempool be exhausted. This patch refines the free function. Fixes: 770f4dfe0f79 ("net/idpf: support basic Tx data path") Cc: stable@dpdk.org Signed-off-by: Jingjing Wu Signed-off-by: Beilei Xing --- drivers/net/idpf/idpf_rxtx.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/net/idpf/idpf_rxtx.c b/drivers/net/idpf/idpf_rxtx.c index b4a396c3f5..5aef8ba2b6 100644 --- a/drivers/net/idpf/idpf_rxtx.c +++ b/drivers/net/idpf/idpf_rxtx.c @@ -1508,6 +1508,7 @@ idpf_split_tx_free(struct idpf_tx_queue *cq) struct idpf_tx_entry *txe; struct idpf_tx_queue *txq; uint16_t gen, qid, q_head; + uint16_t nb_desc_clean; uint8_t ctype; txd = &compl_ring[next]; @@ -1525,20 +1526,24 @@ idpf_split_tx_free(struct idpf_tx_queue *cq) switch (ctype) { case IDPF_TXD_COMPLT_RE: - if (q_head == 0) - txq->last_desc_cleaned = txq->nb_tx_desc - 1; - else - txq->last_desc_cleaned = q_head - 1; - if (unlikely((txq->last_desc_cleaned % 32) == 0)) { + /* clean to q_head which indicates be fetched txq desc id + 1. + * TODO: need to refine and remove the if condition. + */ + if (unlikely(q_head % 32)) { PMD_DRV_LOG(ERR, "unexpected desc (head = %u) completion.", q_head); return; } - + if (txq->last_desc_cleaned > q_head) + nb_desc_clean = (txq->nb_tx_desc - txq->last_desc_cleaned) + + q_head; + else + nb_desc_clean = q_head - txq->last_desc_cleaned; + txq->nb_free += nb_desc_clean; + txq->last_desc_cleaned = q_head; break; case IDPF_TXD_COMPLT_RS: - txq->nb_free++; - txq->nb_used--; + /* q_head indicates sw_id when ctype is 2 */ txe = &txq->sw_ring[q_head]; if (txe->mbuf != NULL) { rte_pktmbuf_free_seg(txe->mbuf); @@ -1693,12 +1698,16 @@ idpf_splitq_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, /* fill the last descriptor with End of Packet (EOP) bit */ txd->qw1.cmd_dtype |= IDPF_TXD_FLEX_FLOW_CMD_EOP; - if (unlikely((tx_id % 32) == 0)) - txd->qw1.cmd_dtype |= IDPF_TXD_FLEX_FLOW_CMD_RE; if (ol_flags & IDPF_TX_CKSUM_OFFLOAD_MASK) txd->qw1.cmd_dtype |= IDPF_TXD_FLEX_FLOW_CMD_CS_EN; txq->nb_free = (uint16_t)(txq->nb_free - nb_used); txq->nb_used = (uint16_t)(txq->nb_used + nb_used); + + if (txq->nb_used >= 32) { + txd->qw1.cmd_dtype |= IDPF_TXD_FLEX_FLOW_CMD_RE; + /* Update txq RE bit counters */ + txq->nb_used = 0; + } } /* update the tail pointer if any packets were processed */ From patchwork Fri Jan 6 09:05:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 121659 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 38FB7A00C2; Fri, 6 Jan 2023 10:28:20 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4970942D32; Fri, 6 Jan 2023 10:28:04 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id E69E842D22; Fri, 6 Jan 2023 10:28:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672997283; x=1704533283; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cqPtjwjH5zOYb5XJvAUnBsq14SG0bZyeUGLToaST0Z0=; b=nOeMebmgrekxQT+NhxKPZtnpoiBHSDK4iJPy8faqk6WKQLifhvzclQ6q 3VIDMSTqJnqK9etVNiF9haHIs0X49vC6BcxzJVr50OSjBfybzsbLqdCtk mc0wDYklN73JB4styphckXBoex5CoGqOShLZUAbrAfIDB9+5YUI8+DHp3 T5BGfBOdr0cZz6Rg3Up6rGvwtfftntqemqEioJPu0Ly31lbzliYYvmk1O uFeUCD5CwUl2x0QsYdEHVADbf30tyvJ176PzqQ5Ki36abLZNbHBGireuB Wr8clROD+eG1WfDKCrINg9QDZBAJUYyo41X+FFoIjCxgJduc28zfkobQ8 Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="386893922" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="386893922" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jan 2023 01:28:02 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="655907984" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="655907984" Received: from dpdk-beileix-3.sh.intel.com ([10.67.110.253]) by orsmga002.jf.intel.com with ESMTP; 06 Jan 2023 01:28:00 -0800 From: beilei.xing@intel.com To: qi.z.zhang@intel.com Cc: dev@dpdk.org, Jingjing Wu , stable@dpdk.org, Beilei Xing Subject: [PATCH v2 4/5] net/idpf: fix driver init symbols Date: Fri, 6 Jan 2023 09:05:00 +0000 Message-Id: <20230106090501.9106-5-beilei.xing@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20230106090501.9106-1-beilei.xing@intel.com> References: <20221208072725.32434-1-beilei.xing@intel.com> <20230106090501.9106-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jingjing Wu This patch fixes idpf driver init symbols. Fixes: 549343c25db8 ("net/idpf: support device initialization") Cc: stable@dpdk.org Signed-off-by: Jingjing Wu Signed-off-by: Beilei Xing --- drivers/net/idpf/idpf_ethdev.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c index f7b3f8f515..89af27ca34 100644 --- a/drivers/net/idpf/idpf_ethdev.c +++ b/drivers/net/idpf/idpf_ethdev.c @@ -1251,7 +1251,11 @@ static struct rte_pci_driver rte_idpf_pmd = { */ RTE_PMD_REGISTER_PCI(net_idpf, rte_idpf_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_idpf, pci_id_idpf_map); -RTE_PMD_REGISTER_KMOD_DEP(net_ice, "* igb_uio | uio_pci_generic | vfio-pci"); +RTE_PMD_REGISTER_KMOD_DEP(net_idpf, "* igb_uio | vfio-pci"); +RTE_PMD_REGISTER_PARAM_STRING(net_idpf, + IDPF_TX_SINGLE_Q "=<0|1> " + IDPF_RX_SINGLE_Q "=<0|1> " + IDPF_VPORT "=[vport_set0,[vport_set1],...]"); RTE_LOG_REGISTER_SUFFIX(idpf_logtype_init, init, NOTICE); RTE_LOG_REGISTER_SUFFIX(idpf_logtype_driver, driver, NOTICE); From patchwork Fri Jan 6 09:05:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 121660 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E74BDA00C2; Fri, 6 Jan 2023 10:28:25 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5827242D39; Fri, 6 Jan 2023 10:28:06 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 9F46442D2C for ; Fri, 6 Jan 2023 10:28:04 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672997284; x=1704533284; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=dEfSiFkacgZ+UF6aDGmOsOdIgqXCS9DyzG8rYSXTDag=; b=V58dik0HfBQjRm/somfAep/CY0HmgW37STYs+/EyEyVtAFgTJtudMua4 ShzQrPxeFGlxHdihvuC4y9txmW/fS+sUXATfBEG/stC8gyKVOdUiGV2+T jqazAsQ3iqQoFX73DdvJ1zpIN/hjQOH3WSnkjstOPddhOqH2EHtTvpMox PQolFnO0uo0N2R84BA6MUX2b4IiaGIS37XTYYcxJHY/wy9aeNSCOXBuQa RdwtnBwZIxnrmk3Q0U1tpWRdGaOaP4Ssvh3hApCEk55x2r6hRoW/mc9Eg UHYxCQTgxDGpeNpSvwmHQezeNZin2RvwlMtFw5BawqV1wBs2wvrT/uMdR A==; X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="386893927" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="386893927" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jan 2023 01:28:04 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10581"; a="655907988" X-IronPort-AV: E=Sophos;i="5.96,304,1665471600"; d="scan'208";a="655907988" Received: from dpdk-beileix-3.sh.intel.com ([10.67.110.253]) by orsmga002.jf.intel.com with ESMTP; 06 Jan 2023 01:28:02 -0800 From: beilei.xing@intel.com To: qi.z.zhang@intel.com Cc: dev@dpdk.org, Jingjing Wu , Beilei Xing Subject: [PATCH v2 5/5] net/idpf: refine MTU setting Date: Fri, 6 Jan 2023 09:05:01 +0000 Message-Id: <20230106090501.9106-6-beilei.xing@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20230106090501.9106-1-beilei.xing@intel.com> References: <20221208072725.32434-1-beilei.xing@intel.com> <20230106090501.9106-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jingjing Wu This patch refines MTU configuration. Signed-off-by: Jingjing Wu Signed-off-by: Beilei Xing --- drivers/net/idpf/idpf_ethdev.c | 37 +++++++++++++++++++--------------- drivers/net/idpf/idpf_ethdev.h | 1 + 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c index 89af27ca34..3f1b77144c 100644 --- a/drivers/net/idpf/idpf_ethdev.c +++ b/drivers/net/idpf/idpf_ethdev.c @@ -56,9 +56,9 @@ idpf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->max_rx_queues = adapter->caps->max_rx_q; dev_info->max_tx_queues = adapter->caps->max_tx_q; dev_info->min_rx_bufsize = IDPF_MIN_BUF_SIZE; - dev_info->max_rx_pktlen = IDPF_MAX_FRAME_SIZE; + dev_info->max_rx_pktlen = vport->max_mtu + IDPF_ETH_OVERHEAD; - dev_info->max_mtu = dev_info->max_rx_pktlen - IDPF_ETH_OVERHEAD; + dev_info->max_mtu = vport->max_mtu; dev_info->min_mtu = RTE_ETHER_MIN_MTU; dev_info->flow_type_rss_offloads = IDPF_RSS_OFFLOAD_ALL; @@ -104,14 +104,23 @@ idpf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) } static int -idpf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu __rte_unused) +idpf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { + struct idpf_vport *vport = dev->data->dev_private; + /* mtu setting is forbidden if port is start */ if (dev->data->dev_started) { PMD_DRV_LOG(ERR, "port must be stopped before configuration"); return -EBUSY; } + if (mtu > vport->max_mtu) { + PMD_DRV_LOG(ERR, "MTU should be less than %d", vport->max_mtu); + return -EINVAL; + } + + vport->max_pkt_len = mtu + IDPF_ETH_OVERHEAD; + return 0; } @@ -381,6 +390,10 @@ idpf_dev_configure(struct rte_eth_dev *dev) return -1; } + vport->max_pkt_len = + (dev->data->mtu == 0) ? IDPF_DEFAULT_MTU : dev->data->mtu + + IDPF_ETH_OVERHEAD; + return 0; } @@ -513,39 +526,31 @@ idpf_dev_start(struct rte_eth_dev *dev) vport->stopped = 0; - if (dev->data->mtu > vport->max_mtu) { - PMD_DRV_LOG(ERR, "MTU should be less than %d", vport->max_mtu); - ret = -EINVAL; - goto err_mtu; - } - - vport->max_pkt_len = dev->data->mtu + IDPF_ETH_OVERHEAD; - req_vecs_num = IDPF_DFLT_Q_VEC_NUM; if (req_vecs_num + adapter->used_vecs_num > num_allocated_vectors) { PMD_DRV_LOG(ERR, "The accumulated request vectors' number should be less than %d", num_allocated_vectors); ret = -EINVAL; - goto err_mtu; + goto err_vec; } ret = idpf_vc_alloc_vectors(vport, req_vecs_num); if (ret != 0) { PMD_DRV_LOG(ERR, "Failed to allocate interrupt vectors"); - goto err_mtu; + goto err_vec; } adapter->used_vecs_num += req_vecs_num; ret = idpf_config_rx_queues_irqs(dev); if (ret != 0) { PMD_DRV_LOG(ERR, "Failed to configure irqs"); - goto err_mtu; + goto err_vec; } ret = idpf_start_queues(dev); if (ret != 0) { PMD_DRV_LOG(ERR, "Failed to start queues"); - goto err_mtu; + goto err_vec; } idpf_set_rx_function(dev); @@ -561,7 +566,7 @@ idpf_dev_start(struct rte_eth_dev *dev) err_vport: idpf_stop_queues(dev); -err_mtu: +err_vec: return ret; } diff --git a/drivers/net/idpf/idpf_ethdev.h b/drivers/net/idpf/idpf_ethdev.h index bf37d5184c..b0746e5041 100644 --- a/drivers/net/idpf/idpf_ethdev.h +++ b/drivers/net/idpf/idpf_ethdev.h @@ -39,6 +39,7 @@ #define IDPF_MIN_BUF_SIZE 1024 #define IDPF_MAX_FRAME_SIZE 9728 #define IDPF_MIN_FRAME_SIZE 14 +#define IDPF_DEFAULT_MTU RTE_ETHER_MTU #define IDPF_NUM_MACADDR_MAX 64