ethdev: fix representor port ID search by name
authorViacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>
Mon, 11 Oct 2021 12:53:06 +0000 (15:53 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 12 Oct 2021 14:54:20 +0000 (16:54 +0200)
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 <viacheslav.galaktionov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Acked-by: Haiyue Wang <haiyue.wang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
Reviewed-by: Xueming Li <xuemingl@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/net/bnxt/bnxt_reps.c
drivers/net/enic/enic_vf_representor.c
drivers/net/i40e/i40e_vf_representor.c
drivers/net/ice/ice_dcf_vf_representor.c
drivers/net/ixgbe/ixgbe_vf_representor.c
drivers/net/mlx5/linux/mlx5_os.c
drivers/net/mlx5/windows/mlx5_os.c
lib/ethdev/ethdev_driver.h
lib/ethdev/rte_class_eth.c
lib/ethdev/rte_ethdev.c
lib/ethdev/rte_ethdev_core.h

index df05619..b7e88e0 100644 (file)
@@ -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,
index cfd02c0..1a44118 100644 (file)
@@ -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);
index 0481b55..d65b821 100644 (file)
@@ -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;
index b547c42..c5335ac 100644 (file)
@@ -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;
 
index d5b636a..9fa7598 100644 (file)
@@ -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;
index e036ed1..0dcf500 100644 (file)
@@ -1676,6 +1676,19 @@ err_secondary:
        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, dpdk_dev) {
+                       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);
index 149253d..ba4f485 100644 (file)
@@ -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, dpdk_dev) {
+                       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
index 7ce0f77..c4ea735 100644 (file)
@@ -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);
index 1fe5fa1..eda216c 100644 (file)
@@ -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],
index b3af7fe..c909a9f 100644 (file)
@@ -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(&eth_dev->data->flow_ops_mutex, NULL);
 
@@ -5914,7 +5915,7 @@ parse_cleanup:
 }
 
 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)
@@ -5930,7 +5931,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. */
@@ -5945,7 +5946,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;
 
@@ -5964,7 +5965,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;
 
index 2296872..8aae713 100644 (file)
@@ -181,6 +181,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 */