Hi,

> -----Original Message-----
> From: Bing Zhao <bi...@mellanox.com>
> Sent: Tuesday, March 24, 2020 2:59 PM
> To: Ori Kam <or...@mellanox.com>; Matan Azrad <ma...@mellanox.com>
> Cc: Raslan Darawsheh <rasl...@mellanox.com>; Slava Ovsiienko
> <viachesl...@mellanox.com>; dev@dpdk.org
> Subject: [PATCH] net/mlx5: introduce dev parameter for hairpin
> 
> When creating a hairpin queue, the total data size and the maximal
> number of packets are interrelated. The differ is the stride size.
> Larger buffer size means big packet like jumbo could be supported,
> but in the meanwhile, it will introduce more cache misses and have a
> side effect on the performance.
> Now a new device parameter "hp_buf_log_sz" is introduced for
> applications to set the total data buffer size (the logarithm value).
> Then the maximal number of packets will also be calculated
> automaticlly by this value.
> Applications could also change this value to a larger one in order
> to support larger packets in hairpin case. A smaller value will be
> beneficial for memory consumption.
> If it is not set, the default value will be used.
> 
> Signed-off-by: Bing Zhao <bi...@mellanox.com>
> ---
>  drivers/net/mlx5/mlx5.c      | 10 ++++++++++
>  drivers/net/mlx5/mlx5.h      |  1 +
>  drivers/net/mlx5/mlx5_defs.h |  2 +-
>  drivers/net/mlx5/mlx5_rxq.c  | 17 ++++++++++++++---
>  drivers/net/mlx5/mlx5_txq.c  | 17 ++++++++++++++---
>  5 files changed, 40 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index 94aaa60..3e6eaa0 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -150,6 +150,12 @@
>  /* Configure timeout of LRO session (in microseconds). */
>  #define MLX5_LRO_TIMEOUT_USEC "lro_timeout_usec"
> 
> +/*
> + * Device parameter to configure the total data buffer size for a single
> + * hairpin queue (logarithm value).
> + */
> +#define MLX5_HP_BUF_SIZE "hp_buf_log_sz"
> +
>  #ifndef HAVE_IBV_MLX5_MOD_MPW
>  #define MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED (1 << 2)
>  #define MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW (1 << 3)
> @@ -1580,6 +1586,8 @@ struct mlx5_flow_id_pool *
>               config->lro.timeout = tmp;
>       } else if (strcmp(MLX5_CLASS_ARG_NAME, key) == 0) {
>               DRV_LOG(DEBUG, "class argument is %s.", val);
> +     } else if (strcmp(MLX5_HP_BUF_SIZE, key) == 0) {
> +             config->log_hp_size = tmp;
>       } else {
>               DRV_LOG(WARNING, "%s: unknown parameter", key);
>               rte_errno = EINVAL;
> @@ -1632,6 +1640,7 @@ struct mlx5_flow_id_pool *
>               MLX5_MAX_DUMP_FILES_NUM,
>               MLX5_LRO_TIMEOUT_USEC,
>               MLX5_CLASS_ARG_NAME,
> +             MLX5_HP_BUF_SIZE,
>               NULL,
>       };
>       struct rte_kvargs *kvlist;
> @@ -3342,6 +3351,7 @@ struct mlx5_flow_id_pool *
>               },
>               .dv_esw_en = 1,
>               .dv_flow_en = 1,
> +             .log_hp_size = MLX5_ARG_UNSET,
>       };
>       /* Device specific configuration. */
>       switch (pci_dev->id.device_id) {
> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
> index d7c519b..53f35fd 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -191,6 +191,7 @@ struct mlx5_dev_config {
>       unsigned int tso_max_payload_sz; /* Maximum TCP payload for TSO.
> */
>       unsigned int ind_table_max_size; /* Maximum indirection table size.
> */
>       unsigned int max_dump_files_num; /* Maximum dump files per
> queue. */
> +     unsigned int log_hp_size; /* Single hairpin queue data size in total. */
>       int txqs_inline; /* Queue number threshold for inlining. */
>       int txq_inline_min; /* Minimal amount of data bytes to inline. */
>       int txq_inline_max; /* Max packet size for inlining with SEND. */
> diff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h
> index 83ca367..19e8253 100644
> --- a/drivers/net/mlx5/mlx5_defs.h
> +++ b/drivers/net/mlx5/mlx5_defs.h
> @@ -175,7 +175,7 @@
> 
>  /* Hairpin TX/RX queue configuration parameters. */
>  #define MLX5_HAIRPIN_QUEUE_STRIDE 6
> -#define MLX5_HAIRPIN_JUMBO_LOG_SIZE (15 + 2)
> +#define MLX5_HAIRPIN_JUMBO_LOG_SIZE (14 + 2)
> 
>  /* Definition of static_assert found in /usr/include/assert.h */
>  #ifndef HAVE_STATIC_ASSERT
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index 8a6b410..3fdb632 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -1286,9 +1286,20 @@
>       attr.hairpin = 1;
>       max_wq_data = priv->config.hca_attr.log_max_hairpin_wq_data_sz;
>       /* Jumbo frames > 9KB should be supported, and more packets. */
> -     attr.wq_attr.log_hairpin_data_sz =
> -                     (max_wq_data <
> MLX5_HAIRPIN_JUMBO_LOG_SIZE) ?
> -                     max_wq_data : MLX5_HAIRPIN_JUMBO_LOG_SIZE;
> +     if (priv->config.log_hp_size != (uint32_t)MLX5_ARG_UNSET) {
> +             if (priv->config.log_hp_size > max_wq_data) {
> +                     DRV_LOG(ERR, "total data size %u power of 2 is "
> +                             "too large for hairpin",
> +                             priv->config.log_hp_size);
> +                     rte_errno = ERANGE;
> +                     return NULL;
> +             }
> +             attr.wq_attr.log_hairpin_data_sz = priv->config.log_hp_size;
> +     } else {
> +             attr.wq_attr.log_hairpin_data_sz =
> +                             (max_wq_data <
> MLX5_HAIRPIN_JUMBO_LOG_SIZE) ?
> +                              max_wq_data :
> MLX5_HAIRPIN_JUMBO_LOG_SIZE;
> +     }
>       /* Set the packets number to the maximum value for performance.
> */
>       attr.wq_attr.log_hairpin_num_packets =
>                       attr.wq_attr.log_hairpin_data_sz -
> diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
> index 57bc116..0653f4c 100644
> --- a/drivers/net/mlx5/mlx5_txq.c
> +++ b/drivers/net/mlx5/mlx5_txq.c
> @@ -512,9 +512,20 @@
>       attr.tis_lst_sz = 1;
>       max_wq_data = priv->config.hca_attr.log_max_hairpin_wq_data_sz;
>       /* Jumbo frames > 9KB should be supported, and more packets. */
> -     attr.wq_attr.log_hairpin_data_sz =
> -                     (max_wq_data <
> MLX5_HAIRPIN_JUMBO_LOG_SIZE) ?
> -                     max_wq_data : MLX5_HAIRPIN_JUMBO_LOG_SIZE;
> +     if (priv->config.log_hp_size != (uint32_t)MLX5_ARG_UNSET) {
> +             if (priv->config.log_hp_size > max_wq_data) {
> +                     DRV_LOG(ERR, "total data size %u power of 2 is "
> +                             "too large for hairpin",
> +                             priv->config.log_hp_size);
> +                     rte_errno = ERANGE;
> +                     return NULL;
> +             }
> +             attr.wq_attr.log_hairpin_data_sz = priv->config.log_hp_size;
> +     } else {
> +             attr.wq_attr.log_hairpin_data_sz =
> +                             (max_wq_data <
> MLX5_HAIRPIN_JUMBO_LOG_SIZE) ?
> +                              max_wq_data :
> MLX5_HAIRPIN_JUMBO_LOG_SIZE;
> +     }
>       /* Set the packets number to the maximum value for performance.
> */
>       attr.wq_attr.log_hairpin_num_packets =
>                       attr.wq_attr.log_hairpin_data_sz -
> --
> 1.8.3.1


Patch applied to next-net-mlx,
Kindest regards
Raslan Darawsheh

Reply via email to