[dpdk-dev] [PATCH v2 1/2] net/mlx5: modify PMD args process

Nélio Laranjeiro nelio.laranjeiro at 6wind.com
Wed Apr 19 08:50:53 CEST 2017


On Tue, Apr 18, 2017 at 01:22:27PM +0300, Shahaf Shuler wrote:
> Currently the argument process is done without indication which
> parameter was forced by the application and which one is on it
> default value.
> This becomes problematic when different features requires different
> defaults. For example, Enhanced multi packet send and TSO.
> 
> This commit modifies the argument process, enabling to differ
> which parameter was forced by the application.
> 
> Signed-off-by: Shahaf Shuler <shahafs at mellanox.com>
> Acked-by: Yongseok Koh <yskoh at mellanox.com>
> ---
> on v2:
>  * changed MLX5_UNSET to MLX5_ARG_UNSET. 
> ---
>  drivers/net/mlx5/mlx5.c | 72 +++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 61 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index b7eb9b56a..78724a1bb 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -93,6 +93,18 @@
>  /* Device parameter to enable hardware TSO offload. */
>  #define MLX5_TSO "tso"
>  
> +/* Default PMD specific parameter value. */
> +#define MLX5_ARG_UNSET (-1)
> +
> +struct mlx5_args {
> +	int cqe_comp;
> +	int txq_inline;
> +	int txqs_inline;
> +	int mps;
> +	int mpw_hdr_dseg;
> +	int inline_max_packet_sz;
> +	int tso;
> +};
>  /**
>   * Retrieve integer value from environment variable.
>   *
> @@ -286,7 +298,7 @@ mlx5_dev_idx(struct rte_pci_addr *pci_addr)
>  static int
>  mlx5_args_check(const char *key, const char *val, void *opaque)
>  {
> -	struct priv *priv = opaque;
> +	struct mlx5_args *args = opaque;
>  	unsigned long tmp;
>  
>  	errno = 0;
> @@ -296,19 +308,19 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
>  		return errno;
>  	}
>  	if (strcmp(MLX5_RXQ_CQE_COMP_EN, key) == 0) {
> -		priv->cqe_comp = !!tmp;
> +		args->cqe_comp = !!tmp;
>  	} else if (strcmp(MLX5_TXQ_INLINE, key) == 0) {
> -		priv->txq_inline = tmp;
> +		args->txq_inline = tmp;
>  	} else if (strcmp(MLX5_TXQS_MIN_INLINE, key) == 0) {
> -		priv->txqs_inline = tmp;
> +		args->txqs_inline = tmp;
>  	} else if (strcmp(MLX5_TXQ_MPW_EN, key) == 0) {
> -		priv->mps = !!tmp ? priv->mps : MLX5_MPW_DISABLED;
> +		args->mps = !!tmp;
>  	} else if (strcmp(MLX5_TXQ_MPW_HDR_DSEG_EN, key) == 0) {
> -		priv->mpw_hdr_dseg = !!tmp;
> +		args->mpw_hdr_dseg = !!tmp;
>  	} else if (strcmp(MLX5_TXQ_MAX_INLINE_LEN, key) == 0) {
> -		priv->inline_max_packet_sz = tmp;
> +		args->inline_max_packet_sz = tmp;
>  	} else if (strcmp(MLX5_TSO, key) == 0) {
> -		priv->tso = !!tmp;
> +		args->tso = !!tmp;
>  	} else {
>  		WARN("%s: unknown parameter", key);
>  		return -EINVAL;
> @@ -328,7 +340,7 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
>   *   0 on success, errno value on failure.
>   */
>  static int
> -mlx5_args(struct priv *priv, struct rte_devargs *devargs)
> +mlx5_args(struct mlx5_args *args, struct rte_devargs *devargs)
>  {
>  	const char **params = (const char *[]){
>  		MLX5_RXQ_CQE_COMP_EN,
> @@ -354,7 +366,7 @@ mlx5_args(struct priv *priv, struct rte_devargs *devargs)
>  	for (i = 0; (params[i] != NULL); ++i) {
>  		if (rte_kvargs_count(kvlist, params[i])) {
>  			ret = rte_kvargs_process(kvlist, params[i],
> -						 mlx5_args_check, priv);
> +						 mlx5_args_check, args);
>  			if (ret != 0) {
>  				rte_kvargs_free(kvlist);
>  				return ret;
> @@ -368,6 +380,34 @@ mlx5_args(struct priv *priv, struct rte_devargs *devargs)
>  static struct eth_driver mlx5_driver;
>  
>  /**
> + * Assign parameters from args into priv, only non default
> + * values are considered.
> + *
> + * @param[out] priv
> + *   Pointer to private structure.
> + * @param[in] args
> + *   Pointer to args values.
> + */
> +static void
> +mlx5_args_assign(struct priv *priv, struct mlx5_args *args)
> +{
> +	if (args->cqe_comp != MLX5_ARG_UNSET)
> +		priv->cqe_comp = args->cqe_comp;
> +	if (args->txq_inline != MLX5_ARG_UNSET)
> +		priv->txq_inline = args->txq_inline;
> +	if (args->txqs_inline != MLX5_ARG_UNSET)
> +		priv->txqs_inline = args->txqs_inline;
> +	if (args->mps != MLX5_ARG_UNSET)
> +		priv->mps = args->mps ? priv->mps : 0;
> +	if (args->mpw_hdr_dseg != MLX5_ARG_UNSET)
> +		priv->mpw_hdr_dseg = args->mpw_hdr_dseg;
> +	if (args->inline_max_packet_sz != MLX5_ARG_UNSET)
> +		priv->inline_max_packet_sz = args->inline_max_packet_sz;
> +	if (args->tso != MLX5_ARG_UNSET)
> +		priv->tso = args->tso;
> +}
> +
> +/**
>   * DPDK callback to register a PCI device.
>   *
>   * This function creates an Ethernet device for each port of a given
> @@ -502,6 +542,15 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
>  		struct ibv_exp_device_attr exp_device_attr;
>  		struct ether_addr mac;
>  		uint16_t num_vfs = 0;
> +		struct mlx5_args args = {
> +			.cqe_comp = MLX5_ARG_UNSET,
> +			.txq_inline = MLX5_ARG_UNSET,
> +			.txqs_inline = MLX5_ARG_UNSET,
> +			.mps = MLX5_ARG_UNSET,
> +			.mpw_hdr_dseg = MLX5_ARG_UNSET,
> +			.inline_max_packet_sz = MLX5_ARG_UNSET,
> +			.tso = MLX5_ARG_UNSET,
> +		};
>  
>  		exp_device_attr.comp_mask =
>  			IBV_EXP_DEVICE_ATTR_EXP_CAP_FLAGS |
> @@ -570,12 +619,13 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
>  		}
>  		priv->cqe_comp = 1; /* Enable compression by default. */
>  		priv->tunnel_en = tunnel_en;
> -		err = mlx5_args(priv, pci_dev->device.devargs);
> +		err = mlx5_args(&args, pci_dev->device.devargs);
>  		if (err) {
>  			ERROR("failed to process device arguments: %s",
>  			      strerror(err));
>  			goto port_error;
>  		}
> +		mlx5_args_assign(priv, &args);
>  		if (ibv_exp_query_device(ctx, &exp_device_attr)) {
>  			ERROR("ibv_exp_query_device() failed");
>  			goto port_error;
> -- 
> 2.12.0
> 

For the series,

Acked-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>

-- 
Nélio Laranjeiro
6WIND


More information about the dev mailing list