Implement probing of a device multiple times, see [1]. Consecutive probing requests with a devargs string may contain repetitive master and representors devices for which eth device should be created. If an eth device already exists - silently ignore it.
[1] Serie: ("eal: allow hotplug to skip an already probed device") https://patches.dpdk.org/project/dpdk/list/?series=1580 Signed-off-by: Ophir Munk <ophi...@mellanox.com> --- drivers/net/mlx5/mlx5.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index b2b0aaa..16a8b9d 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -736,6 +736,7 @@ struct ether_addr mac; char name[RTE_ETH_NAME_MAX_LEN]; int own_domain_id = 0; + uint16_t port_id; unsigned int i; /* Determine if this port representor is supposed to be spawned. */ @@ -758,6 +759,17 @@ return NULL; } } + /* Build device name */ + if (!switch_info->representor) + rte_strlcpy(name, dpdk_dev->name, sizeof(name)); + else + snprintf(name, sizeof(name), "%s_representor_%u", + dpdk_dev->name, switch_info->port_name); + /* if dev (master or representor) is already spawned - return NULL */ + if (rte_eth_dev_get_port_by_name(name, &port_id) == 0) { + rte_errno = EBUSY; + return NULL; + } /* Prepare shared data between primary and secondary process. */ mlx5_prepare_shared_data(); errno = 0; @@ -864,11 +876,6 @@ DEBUG("ibv_query_device_ex() failed"); goto error; } - if (!switch_info->representor) - rte_strlcpy(name, dpdk_dev->name, sizeof(name)); - else - snprintf(name, sizeof(name), "%s_representor_%u", - dpdk_dev->name, switch_info->port_name); DRV_LOG(DEBUG, "naming Ethernet device \"%s\"", name); if (rte_eal_process_type() == RTE_PROC_SECONDARY) { eth_dev = rte_eth_dev_attach_secondary(name); @@ -1298,9 +1305,6 @@ struct mlx5_dev_spawn_data { assert(pci_drv == &mlx5_driver); errno = 0; - if (rte_dev_is_probed(&pci_dev->device)) - return -EEXIST; - ibv_list = mlx5_glue->get_device_list(&ret); if (!ibv_list) { rte_errno = errno ? errno : ENOSYS; @@ -1412,7 +1416,7 @@ struct mlx5_dev_spawn_data { if (!list[i].eth_dev) { if (rte_errno != EBUSY) break; - /* Device is disabled, ignore it. */ + /* Device is disabled or already spawned. Ignore it. */ continue; } restore = list[i].eth_dev->data->dev_flags; -- 1.8.3.1