]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix find sibling devices
authorGregory Etelson <getelson@nvidia.com>
Tue, 3 Aug 2021 15:06:58 +0000 (18:06 +0300)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 4 Aug 2021 09:27:49 +0000 (11:27 +0200)
The routine mlx5_eth_find_next() and related iterating macro
MLX5_ETH_FOREACH_DEV is used to iterate through sibling devices (all
representors share the same configuration and switching domain) on top
of specified root device.

The root device parameter was specified as NULL, and it caused
missing siblings in iteration during representor device probing,
causing:

1. allocating new domain_id for the device being probed.
2. discrepancy in representor configurations and potential overall
   driver malfunctions.

Fixes: 56bb3c84e982 ("net/mlx5: reduce PCI dependency")
Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/net/mlx5/linux/mlx5_os.c
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/windows/mlx5_os.c

index eeeca27ac2a049efeff235b35fdc5a1172d27669..5f8766aa481e84dfb74ce463bb6e5e4bc3036f04 100644 (file)
@@ -1314,7 +1314,7 @@ err_secondary:
        }
        /* Override some values set by hardware configuration. */
        mlx5_args(config, dpdk_dev->devargs);
-       err = mlx5_dev_check_sibling_config(priv, config);
+       err = mlx5_dev_check_sibling_config(priv, config, dpdk_dev);
        if (err)
                goto error;
        config->hw_csum = !!(sh->device_attr.device_cap_flags_ex &
index 90990ffdc21c9a61e40c6859a4c23e305d4155c2..f84e061fe7195bb5ed56c91201db78ee2b874672 100644 (file)
@@ -2297,7 +2297,8 @@ rte_pmd_mlx5_get_dyn_flag_names(char *names[], unsigned int n)
  */
 int
 mlx5_dev_check_sibling_config(struct mlx5_priv *priv,
-                             struct mlx5_dev_config *config)
+                             struct mlx5_dev_config *config,
+                             struct rte_device *dpdk_dev)
 {
        struct mlx5_dev_ctx_shared *sh = priv->sh;
        struct mlx5_dev_config *sh_conf = NULL;
@@ -2308,7 +2309,7 @@ mlx5_dev_check_sibling_config(struct mlx5_priv *priv,
        if (sh->refcnt == 1)
                return 0;
        /* Find the device with shared context. */
-       MLX5_ETH_FOREACH_DEV(port_id, NULL) {
+       MLX5_ETH_FOREACH_DEV(port_id, dpdk_dev) {
                struct mlx5_priv *opriv =
                        rte_eth_devices[port_id].data->dev_private;
 
index 34d66e93ad769a877346eea0d4284474f98f3dc1..e02714e23196a80923c95ccd1032a51d0cb0bc33 100644 (file)
@@ -1503,7 +1503,8 @@ void mlx5_set_min_inline(struct mlx5_dev_spawn_data *spawn,
                         struct mlx5_dev_config *config);
 void mlx5_set_metadata_mask(struct rte_eth_dev *dev);
 int mlx5_dev_check_sibling_config(struct mlx5_priv *priv,
-                                 struct mlx5_dev_config *config);
+                                 struct mlx5_dev_config *config,
+                                 struct rte_device *dpdk_dev);
 int mlx5_dev_configure(struct rte_eth_dev *dev);
 int mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info);
 int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);
index 5a18f538bcd02298ebe93dcfdc637dc150f23697..5518bc3e763f187876304d64148508ddb9b894ff 100644 (file)
@@ -430,7 +430,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
         * Look for sibling devices in order to reuse their switch domain
         * if any, otherwise allocate one.
         */
-       MLX5_ETH_FOREACH_DEV(port_id, NULL) {
+       MLX5_ETH_FOREACH_DEV(port_id, dpdk_dev) {
                const struct mlx5_priv *opriv =
                        rte_eth_devices[port_id].data->dev_private;