From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 50E3FA034F; Fri, 8 Oct 2021 11:27:36 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D16D14067B; Fri, 8 Oct 2021 11:27:35 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 3DDEA40140 for ; Fri, 8 Oct 2021 11:27:34 +0200 (CEST) Received: by shelob.oktetlabs.ru (Postfix, from userid 122) id C587E7F6D5; Fri, 8 Oct 2021 12:27:33 +0300 (MSK) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=ALL_TRUSTED, DKIM_ADSP_DISCARD, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17]) by shelob.oktetlabs.ru (Postfix) with ESMTP id 67A1B7F4E2; Fri, 8 Oct 2021 12:27:24 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 67A1B7F4E2 Authentication-Results: shelob.oktetlabs.ru/67A1B7F4E2; dkim=none; dkim-atps=neutral From: Andrew Rybchenko To: Ajit Khaparde , Somnath Kotur , John Daley , Hyong Youb Kim , Beilei Xing , Qiming Yang , Qi Zhang , Haiyue Wang , Matan Azrad , Viacheslav Ovsiienko , Thomas Monjalon , Ferruh Yigit Cc: dev@dpdk.org, Viacheslav Galaktionov , Xueming Li Date: Fri, 8 Oct 2021 12:27:13 +0300 Message-Id: <20211008092714.2381365-1-andrew.rybchenko@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210712161747.958019-1-andrew.rybchenko@oktetlabs.ru> References: <20210712161747.958019-1-andrew.rybchenko@oktetlabs.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v6] ethdev: fix representor port ID search by name 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 Sender: "dev" From: Viacheslav Galaktionov The patch is required for all PMDs which do not provide representors info on the representor itself. The function, rte_eth_representor_id_get(), is used in eth_representor_cmp() which is required in ethdev class iterator to search ethdev port ID by name (representor case). Before the patch the function is called on the representor itself and tries to get representors info to match. Search of port ID by name is used after hotplug to find out port ID of the just plugged device. Getting a list of representors from a representor does not make sense. Instead, a backer device should be used. To this end, extend the rte_eth_dev_data structure to include the port ID of the backing device for representors. Signed-off-by: Viacheslav Galaktionov Signed-off-by: Andrew Rybchenko Acked-by: Haiyue Wang Acked-by: Beilei Xing Reviewed-by: Xueming Li --- The new field is added into the hole in rte_eth_dev_data structure. The patch does not change ABI, but extra care is required since ABI check is disabled for the structure because of the libabigail bug [1]. It should not be a problem anyway since 21.11 is a ABI breaking release. Potentially it is bad for out-of-tree drivers which implement representors but do not fill in a new backer_port_id field in rte_eth_dev_data structure. Get ID by name will not work. mlx5 changes should be reviwed by maintainers very carefully, since we are not sure if we patch it correctly. [1] https://sourceware.org/bugzilla/show_bug.cgi?id=28060 v6: - provide more information in the changeset description v5: - try to improve name: backer_port_id instead of parent_port_id - init new field to RTE_MAX_ETHPORTS on allocation to avoid zero port usage by default v4: - apply mlx5 review notes: remove fallback from generic ethdev code and add fallback to mlx5 code to handle legacy usecase v3: - fix mlx5 build breakage v2: - fix mlx5 review notes - try device port ID first before parent in order to address backward compatibility issue drivers/net/bnxt/bnxt_reps.c | 1 + drivers/net/enic/enic_vf_representor.c | 1 + drivers/net/i40e/i40e_vf_representor.c | 1 + drivers/net/ice/ice_dcf_vf_representor.c | 1 + drivers/net/ixgbe/ixgbe_vf_representor.c | 1 + drivers/net/mlx5/linux/mlx5_os.c | 13 +++++++++++++ drivers/net/mlx5/windows/mlx5_os.c | 13 +++++++++++++ lib/ethdev/ethdev_driver.h | 6 +++--- lib/ethdev/rte_class_eth.c | 2 +- lib/ethdev/rte_ethdev.c | 9 +++++---- lib/ethdev/rte_ethdev_core.h | 6 ++++++ 11 files changed, 46 insertions(+), 8 deletions(-) diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c index df05619c3f..b7e88e013a 100644 --- a/drivers/net/bnxt/bnxt_reps.c +++ b/drivers/net/bnxt/bnxt_reps.c @@ -187,6 +187,7 @@ int bnxt_representor_init(struct rte_eth_dev *eth_dev, void *params) eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR | RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; eth_dev->data->representor_id = rep_params->vf_id; + eth_dev->data->backer_port_id = rep_params->parent_dev->data->port_id; rte_eth_random_addr(vf_rep_bp->dflt_mac_addr); memcpy(vf_rep_bp->mac_addr, vf_rep_bp->dflt_mac_addr, diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c index cfd02c03cc..1a4411844a 100644 --- a/drivers/net/enic/enic_vf_representor.c +++ b/drivers/net/enic/enic_vf_representor.c @@ -666,6 +666,7 @@ int enic_vf_representor_init(struct rte_eth_dev *eth_dev, void *init_params) eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR | RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; eth_dev->data->representor_id = vf->vf_id; + eth_dev->data->backer_port_id = pf->port_id; eth_dev->data->mac_addrs = rte_zmalloc("enic_mac_addr_vf", sizeof(struct rte_ether_addr) * ENIC_UNICAST_PERFECT_FILTERS, 0); diff --git a/drivers/net/i40e/i40e_vf_representor.c b/drivers/net/i40e/i40e_vf_representor.c index 0481b55381..d65b821a01 100644 --- a/drivers/net/i40e/i40e_vf_representor.c +++ b/drivers/net/i40e/i40e_vf_representor.c @@ -514,6 +514,7 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params) ethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR | RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; ethdev->data->representor_id = representor->vf_id; + ethdev->data->backer_port_id = pf->dev_data->port_id; /* Setting the number queues allocated to the VF */ ethdev->data->nb_rx_queues = vf->vsi->nb_qps; diff --git a/drivers/net/ice/ice_dcf_vf_representor.c b/drivers/net/ice/ice_dcf_vf_representor.c index b547c42f91..c5335ac3cc 100644 --- a/drivers/net/ice/ice_dcf_vf_representor.c +++ b/drivers/net/ice/ice_dcf_vf_representor.c @@ -426,6 +426,7 @@ ice_dcf_vf_repr_init(struct rte_eth_dev *vf_rep_eth_dev, void *init_param) vf_rep_eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR; vf_rep_eth_dev->data->representor_id = repr->vf_id; + vf_rep_eth_dev->data->backer_port_id = repr->dcf_eth_dev->data->port_id; vf_rep_eth_dev->data->mac_addrs = &repr->mac_addr; diff --git a/drivers/net/ixgbe/ixgbe_vf_representor.c b/drivers/net/ixgbe/ixgbe_vf_representor.c index d5b636a194..9fa75984fb 100644 --- a/drivers/net/ixgbe/ixgbe_vf_representor.c +++ b/drivers/net/ixgbe/ixgbe_vf_representor.c @@ -197,6 +197,7 @@ ixgbe_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params) ethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR; ethdev->data->representor_id = representor->vf_id; + ethdev->data->backer_port_id = representor->pf_ethdev->data->port_id; /* Set representor device ops */ ethdev->dev_ops = &ixgbe_vf_representor_dev_ops; diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 3746057673..612340b3b6 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -1677,6 +1677,19 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, if (priv->representor) { eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR; eth_dev->data->representor_id = priv->representor_id; + MLX5_ETH_FOREACH_DEV(port_id, &priv->pci_dev->device) { + struct mlx5_priv *opriv = + rte_eth_devices[port_id].data->dev_private; + if (opriv && + opriv->master && + opriv->domain_id == priv->domain_id && + opriv->sh == priv->sh) { + eth_dev->data->backer_port_id = port_id; + break; + } + } + if (port_id >= RTE_MAX_ETHPORTS) + eth_dev->data->backer_port_id = eth_dev->data->port_id; } priv->mp_id.port_id = eth_dev->data->port_id; strlcpy(priv->mp_id.name, MLX5_MP_NAME, RTE_MP_MAX_NAME_LEN); diff --git a/drivers/net/mlx5/windows/mlx5_os.c b/drivers/net/mlx5/windows/mlx5_os.c index 26fa927039..a9c244c7dc 100644 --- a/drivers/net/mlx5/windows/mlx5_os.c +++ b/drivers/net/mlx5/windows/mlx5_os.c @@ -543,6 +543,19 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, if (priv->representor) { eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR; eth_dev->data->representor_id = priv->representor_id; + MLX5_ETH_FOREACH_DEV(port_id, &priv->pci_dev->device) { + struct mlx5_priv *opriv = + rte_eth_devices[port_id].data->dev_private; + if (opriv && + opriv->master && + opriv->domain_id == priv->domain_id && + opriv->sh == priv->sh) { + eth_dev->data->backer_port_id = port_id; + break; + } + } + if (port_id >= RTE_MAX_ETHPORTS) + eth_dev->data->backer_port_id = eth_dev->data->port_id; } /* * Store associated network device interface index. This index diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h index 7ce0f7729a..c4ea735732 100644 --- a/lib/ethdev/ethdev_driver.h +++ b/lib/ethdev/ethdev_driver.h @@ -1266,8 +1266,8 @@ struct rte_eth_devargs { * For backward compatibility, if no representor info, direct * map legacy VF (no controller and pf). * - * @param ethdev - * Handle of ethdev port. + * @param port_id + * Port ID of the backing device. * @param type * Representor type. * @param controller @@ -1284,7 +1284,7 @@ struct rte_eth_devargs { */ __rte_internal int -rte_eth_representor_id_get(const struct rte_eth_dev *ethdev, +rte_eth_representor_id_get(uint16_t port_id, enum rte_eth_representor_type type, int controller, int pf, int representor_port, uint16_t *repr_id); diff --git a/lib/ethdev/rte_class_eth.c b/lib/ethdev/rte_class_eth.c index 1fe5fa1f36..eda216ced5 100644 --- a/lib/ethdev/rte_class_eth.c +++ b/lib/ethdev/rte_class_eth.c @@ -95,7 +95,7 @@ eth_representor_cmp(const char *key __rte_unused, c = i / (np * nf); p = (i / nf) % np; f = i % nf; - if (rte_eth_representor_id_get(edev, + if (rte_eth_representor_id_get(edev->data->backer_port_id, eth_da.type, eth_da.nb_mh_controllers == 0 ? -1 : eth_da.mh_controllers[c], diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 028907bc4b..ed7b43a99f 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -524,6 +524,7 @@ rte_eth_dev_allocate(const char *name) eth_dev = eth_dev_get(port_id); strlcpy(eth_dev->data->name, name, sizeof(eth_dev->data->name)); eth_dev->data->port_id = port_id; + eth_dev->data->backer_port_id = RTE_MAX_ETHPORTS; eth_dev->data->mtu = RTE_ETHER_MTU; pthread_mutex_init(ð_dev->data->flow_ops_mutex, NULL); @@ -5915,7 +5916,7 @@ rte_eth_devargs_parse(const char *dargs, struct rte_eth_devargs *eth_da) } int -rte_eth_representor_id_get(const struct rte_eth_dev *ethdev, +rte_eth_representor_id_get(uint16_t port_id, enum rte_eth_representor_type type, int controller, int pf, int representor_port, uint16_t *repr_id) @@ -5931,7 +5932,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev, return -EINVAL; /* Get PMD representor range info. */ - ret = rte_eth_representor_info_get(ethdev->data->port_id, NULL); + ret = rte_eth_representor_info_get(port_id, NULL); if (ret == -ENOTSUP && type == RTE_ETH_REPRESENTOR_VF && controller == -1 && pf == -1) { /* Direct mapping for legacy VF representor. */ @@ -5946,7 +5947,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev, if (info == NULL) return -ENOMEM; info->nb_ranges_alloc = n; - ret = rte_eth_representor_info_get(ethdev->data->port_id, info); + ret = rte_eth_representor_info_get(port_id, info); if (ret < 0) goto out; @@ -5965,7 +5966,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev, continue; if (info->ranges[i].id_end < info->ranges[i].id_base) { RTE_LOG(WARNING, EAL, "Port %hu invalid representor ID Range %u - %u, entry %d\n", - ethdev->data->port_id, info->ranges[i].id_base, + port_id, info->ranges[i].id_base, info->ranges[i].id_end, i); continue; diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h index d2c9ec42c7..66ad8b13c8 100644 --- a/lib/ethdev/rte_ethdev_core.h +++ b/lib/ethdev/rte_ethdev_core.h @@ -185,6 +185,12 @@ struct rte_eth_dev_data { /**< Switch-specific identifier. * Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags. */ + uint16_t backer_port_id; + /**< Port ID of the backing device. + * This device will be used to query representor + * info and calculate representor IDs. + * Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags. + */ pthread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex. */ uint64_t reserved_64s[4]; /**< Reserved for future fields */ -- 2.30.2