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; }