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 8AB77A0C4E; Mon, 12 Jul 2021 18:18:08 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4E6A54069E; Mon, 12 Jul 2021 18:18:08 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id BAFE94069D; Mon, 12 Jul 2021 18:18:06 +0200 (CEST) Received: by shelob.oktetlabs.ru (Postfix, from userid 122) id 14CB67F6C4; Mon, 12 Jul 2021 19:18:06 +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 546E17F519; Mon, 12 Jul 2021 19:17:57 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 546E17F519 Authentication-Results: shelob.oktetlabs.ru/546E17F519; 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 , Shahaf Shuler , Viacheslav Ovsiienko , Thomas Monjalon , Ferruh Yigit , Xueming Li Cc: dev@dpdk.org, Viacheslav Galaktionov , stable@dpdk.org Date: Mon, 12 Jul 2021 19:17:47 +0300 Message-Id: <20210712161747.958019-1-andrew.rybchenko@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH] 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 Fix representor port ID search by name if the representor itself does not provide representors info. Getting a list of representors from a representor does not make sense. Instead, a parent device should be used. To this end, extend the rte_eth_dev_data structure to include the port ID of the parent device for representors. Fixes: df7547a6a2cc ("ethdev: add helper function to get representor ID") Cc: stable@dpdk.org Signed-off-by: Viacheslav Galaktionov Signed-off-by: Andrew Rybchenko --- 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]. Potentially it is bad for out-of-tree drivers which implement representors but do not fill in a new parert_port_id field in rte_eth_dev_data structure. Do we care? May be the patch should add lines to release notes, but I'd like to get initial feedback first. 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 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 | 11 +++++++++++ drivers/net/mlx5/windows/mlx5_os.c | 11 +++++++++++ lib/ethdev/ethdev_driver.h | 6 +++--- lib/ethdev/rte_class_eth.c | 2 +- lib/ethdev/rte_ethdev.c | 8 ++++---- lib/ethdev/rte_ethdev_core.h | 4 ++++ 11 files changed, 39 insertions(+), 8 deletions(-) diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c index bdbad53b7d..902591cd39 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->parent_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 79dd6e5640..6ee7967ce9 100644 --- a/drivers/net/enic/enic_vf_representor.c +++ b/drivers/net/enic/enic_vf_representor.c @@ -662,6 +662,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->parent_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..865b637585 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->parent_port_id = pf->dev_data->parent_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 970461f3e9..c7cd3fd290 100644 --- a/drivers/net/ice/ice_dcf_vf_representor.c +++ b/drivers/net/ice/ice_dcf_vf_representor.c @@ -418,6 +418,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->parent_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..7a2063849e 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->parent_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 be22d9cbd2..5550d30628 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -1511,6 +1511,17 @@ 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) { + const struct mlx5_priv *opriv = + rte_eth_devices[port_id].data->dev_private; + + if (!opriv || + opriv->sh != priv->sh || + opriv->representor) + continue; + eth_dev->data->parent_port_id = port_id; + break; + } } 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 e30b682822..037c928dc1 100644 --- a/drivers/net/mlx5/windows/mlx5_os.c +++ b/drivers/net/mlx5/windows/mlx5_os.c @@ -506,6 +506,17 @@ 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) { + const struct mlx5_priv *opriv = + rte_eth_devices[port_id].data->dev_private; + + if (!opriv || + opriv->sh != priv->sh || + opriv->representor) + continue; + eth_dev->data->parent_port_id = port_id; + break; + } } /* * Store associated network device interface index. This index diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h index 40e474aa7e..07f6d1f9a4 100644 --- a/lib/ethdev/ethdev_driver.h +++ b/lib/ethdev/ethdev_driver.h @@ -1248,8 +1248,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 parent_port_id + * Port ID of the backing device. * @param type * Representor type. * @param controller @@ -1266,7 +1266,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 parent_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..e3b7ab9728 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->parent_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 6ebf52b641..acda1d43fb 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -5997,7 +5997,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 parent_port_id, enum rte_eth_representor_type type, int controller, int pf, int representor_port, uint16_t *repr_id) @@ -6012,7 +6012,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(parent_port_id, NULL); if (ret == -ENOTSUP && type == RTE_ETH_REPRESENTOR_VF && controller == -1 && pf == -1) { /* Direct mapping for legacy VF representor. */ @@ -6026,7 +6026,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev, info = calloc(1, size); if (info == NULL) return -ENOMEM; - ret = rte_eth_representor_info_get(ethdev->data->port_id, info); + ret = rte_eth_representor_info_get(parent_port_id, info); if (ret < 0) goto out; @@ -6045,7 +6045,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, + parent_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 edf96de2dc..13cb84b52f 100644 --- a/lib/ethdev/rte_ethdev_core.h +++ b/lib/ethdev/rte_ethdev_core.h @@ -185,6 +185,10 @@ struct rte_eth_dev_data { /**< Switch-specific identifier. * Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags. */ + uint16_t parent_port_id; + /**< Port ID of the backing device. + * 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