[dpdk-dev] [PATCH v1 57/72] net/mlx5/windows: initial probing implementation

Narcisa Ana Maria Vasile navasile at linux.microsoft.com
Wed Nov 11 01:02:13 CET 2020


On Tue, Oct 27, 2020 at 11:23:20PM +0000, Ophir Munk wrote:
> From: Tal Shnaiderman <talshn at nvidia.com>
> 
> This commit implements mlx5_os_pci_probe API under Windows. It does all
> required initializations then it gets the PCI device list using glue API
> get_device_list().  Next, all non MLX5 matched devices are filtered out.
> The supported NIC types are: CONNECTX4VF, CONNECTX4LXVF, CONNECTX5VF,
> CONNECTX5EXVF, CONNECTX5BFVF, CONNECTX6VF, MELLANOX_CONNECTX6DXVF.  Each
> device in the list is assigned with default configuration parameters,
> most of them are 0. The default dv_flow_en parameter value is 1 (which
> means Windows match and action flows are based on DV code). Next for
> each PCI device call mlx5_dev_spawn() to create an eth device (struct
> rte_ethdev). The implementation of device spawn is in the follow up
> commit.  Finally, the device list is free.
> 
> Signed-off-by: Tal Shnaiderman <talshn at nvidia.com>
> Signed-off-by: Ophir Munk <ophirmu at nvidia.com>
> ---
>  drivers/net/mlx5/windows/mlx5_os.c | 278 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 278 insertions(+)
> 
> +static int
> +mlx5_init_shared_data(void)
> +{
> +	const struct rte_memzone *mz;
> +	int ret = 0;
> +
> +	rte_spinlock_lock(&mlx5_shared_data_lock);
> +	if (mlx5_shared_data == NULL) {

Maybe: Invert the check to reduce indentation. You can also move it before taking the lock: if (mlx5_shared_data) { return 0; }

> +		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> +			/* Allocate shared memory. */
> +			mz = rte_memzone_reserve(MZ_MLX5_PMD_SHARED_DATA,
> +						 sizeof(*mlx5_shared_data),
> +						 SOCKET_ID_ANY, 0);
> +			if (mz == NULL) {
> +				DRV_LOG(ERR,
> +					"Cannot allocate mlx5 shared data");
> +				ret = -rte_errno;
> +				goto error;
> +			}
> +			mlx5_shared_data = mz->addr;
> +			memset(mlx5_shared_data, 0, sizeof(*mlx5_shared_data));
> +			rte_spinlock_init(&mlx5_shared_data->lock);
> +		} else {
> +			/* Lookup allocated shared memory. */
> +			mz = rte_memzone_lookup(MZ_MLX5_PMD_SHARED_DATA);
> +			if (mz == NULL) {
> +				DRV_LOG(ERR,
> +					"Cannot attach mlx5 shared data");
> +				ret = -rte_errno;
> +				goto error;
> +			}
> +			mlx5_shared_data = mz->addr;
> +			memset(&mlx5_local_data, 0, sizeof(mlx5_local_data));
> +		}
> +	}
> +error:
> +	rte_spinlock_unlock(&mlx5_shared_data_lock);
> +	return ret;
> +}

> +	dev_config.dv_flow_en = 1;
> +	dev_config.decap_en = 0;
> +	dev_config.log_hp_size = MLX5_ARG_UNSET;
> +	list[ns].eth_dev = mlx5_dev_spawn(&pci_dev->device,
> +					  &list[ns],
> +					  &dev_config);
> +	if (!list[ns].eth_dev)

mlx5_dev_spawn() updates rte_errno, we should ret to rte_errno before exiting here.

> +		goto exit;
> +	restore = list[ns].eth_dev->data->dev_flags;
> +	rte_eth_copy_pci_info(list[ns].eth_dev, pci_dev);
> +	/* Restore non-PCI flags cleared by the above call. */
> +	list[ns].eth_dev->data->dev_flags |= restore;
> +	rte_eth_dev_probing_finish(list[ns].eth_dev);
> +	ret = 0;
> 2.8.4


More information about the dev mailing list