[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