On Fri, Jan 05, 2018 at 10:04:50AM +0200, Tal Gilboa wrote:
> On 1/4/2018 10:21 PM, Andy Gospodarek wrote:
> > From: Andy Gospodarek <go...@broadcom.com>
> > 
> > Change all mlx5_am* and MLX_AM* references to net_dim and NET_DIM,
> MLX_AM->MLX5_AM
> 
> >     cq_period_mode = enable ?
> > -           MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
> > -           MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
> > +           NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE :
> > +           NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
> I'm not sure about this part. CQE/EQE based moderation is a feature in
> Mellanox's chips, which isn't necessarily coupled with adaptive moderation.
> net_dim lib should know which values to choose according to the selected
> mode, but I don't think mlx5 driver should use an enum from net_dim for
> enabling/disabling HW features. Another issue is that we use the enum value
> as an argument for the command to HW (0=EQE, 1=CQE). If someone would change
> the values it would break the HW feature. I think it would be safer to use
> the NET_DIM_XXX enum only when using functions from net_dim lib.

I've gone back and forth about when to do this (now vs later).

One of the future improments I'd planned was actually to allow profiles
to live in en_dim.c and bnxt_dim.c or have some additional profiles
in net_dim.h.  This is specifially to address some different hardware
limits that might exist as hardware with a maximum that is smaller than
256 usecs (for example) might not find much benefit from how quickly
these existing profiles scale-up.

I'll play with this today for a bit and see what falls out.  My
preference is not to change this for v2 not so as to not hold up this
set too long.

> 
> >     current_cq_period_mode = is_rx_cq ?
> >             priv->channels.params.rx_cq_moderation.cq_period_mode :
> >             priv->channels.params.tx_cq_moderation.cq_period_mode;
> >     mode_changed = cq_period_mode != current_cq_period_mode;
> > -   if (cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE &&
> > +   if (cq_period_mode == NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE &&
> >         !MLX5_CAP_GEN(mdev, cq_period_start_from_cqe))
> >             return -EOPNOTSUPP;
> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c 
> > b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> > index 3aa1c90..edd4077 100644
> > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> > @@ -674,8 +674,8 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c,
> >             wqe->data.lkey = rq->mkey_be;
> >     }
> > -   INIT_WORK(&rq->am.work, mlx5e_rx_am_work);
> > -   rq->am.mode = params->rx_cq_moderation.cq_period_mode;
> > +   INIT_WORK(&rq->dim.work, mlx5e_rx_dim_work);
> > +   rq->dim.mode = params->rx_cq_moderation.cq_period_mode;
> >     rq->page_cache.head = 0;
> >     rq->page_cache.tail = 0;
> > @@ -919,7 +919,7 @@ static int mlx5e_open_rq(struct mlx5e_channel *c,
> >     if (err)
> >             goto err_destroy_rq;
> > -   if (params->rx_am_enabled)
> > +   if (params->rx_dim_enabled)
> >             c->rq.state |= BIT(MLX5E_RQ_STATE_AM);
> >     return 0;
> > @@ -952,7 +952,7 @@ static void mlx5e_deactivate_rq(struct mlx5e_rq *rq)
> >   static void mlx5e_close_rq(struct mlx5e_rq *rq)
> >   {
> > -   cancel_work_sync(&rq->am.work);
> > +   cancel_work_sync(&rq->dim.work);
> >     mlx5e_destroy_rq(rq);
> >     mlx5e_free_rx_descs(rq);
> >     mlx5e_free_rq(rq);
> > @@ -1565,7 +1565,7 @@ static void mlx5e_destroy_cq(struct mlx5e_cq *cq)
> >   }
> >   static int mlx5e_open_cq(struct mlx5e_channel *c,
> > -                    struct mlx5e_cq_moder moder,
> > +                    struct net_dim_cq_moder moder,
> >                      struct mlx5e_cq_param *param,
> >                      struct mlx5e_cq *cq)
> >   {
> > @@ -1747,7 +1747,7 @@ static int mlx5e_open_channel(struct mlx5e_priv 
> > *priv, int ix,
> >                           struct mlx5e_channel_param *cparam,
> >                           struct mlx5e_channel **cp)
> >   {
> > -   struct mlx5e_cq_moder icocq_moder = {0, 0};
> > +   struct net_dim_cq_moder icocq_moder = {0, 0};
> >     struct net_device *netdev = priv->netdev;
> >     int cpu = mlx5e_get_cpu(priv, ix);
> >     struct mlx5e_channel *c;
> > @@ -1999,7 +1999,7 @@ static void mlx5e_build_ico_cq_param(struct 
> > mlx5e_priv *priv,
> >     mlx5e_build_common_cq_param(priv, param);
> > -   param->cq_period_mode = MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
> > +   param->cq_period_mode = NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
> >   }
> >   static void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
> > @@ -4016,13 +4016,13 @@ void mlx5e_set_tx_cq_mode_params(struct 
> > mlx5e_params *params, u8 cq_period_mode)
> >     params->tx_cq_moderation.usec =
> >             MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC;
> > -   if (cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE)
> > +   if (cq_period_mode == NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE)
> >             params->tx_cq_moderation.usec =
> >                     MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC_FROM_CQE;
> >     MLX5E_SET_PFLAG(params, MLX5E_PFLAG_TX_CQE_BASED_MODER,
> >                     params->tx_cq_moderation.cq_period_mode ==
> > -                           MLX5_CQ_PERIOD_MODE_START_FROM_CQE);
> > +                           NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE);
> >   }
> >   void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 
> > cq_period_mode)
> > @@ -4034,17 +4034,17 @@ void mlx5e_set_rx_cq_mode_params(struct 
> > mlx5e_params *params, u8 cq_period_mode)
> >     params->rx_cq_moderation.usec =
> >             MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_USEC;
> > -   if (cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE)
> > +   if (cq_period_mode == NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE)
> >             params->rx_cq_moderation.usec =
> >                     MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_USEC_FROM_CQE;
> > -   if (params->rx_am_enabled)
> > +   if (params->rx_dim_enabled)
> >             params->rx_cq_moderation =
> > -                   mlx5e_am_get_def_profile(cq_period_mode);
> > +                   net_dim_get_def_profile(cq_period_mode);
> >     MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_CQE_BASED_MODER,
> >                     params->rx_cq_moderation.cq_period_mode ==
> > -                           MLX5_CQ_PERIOD_MODE_START_FROM_CQE);
> > +                           NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE);
> >   }
> >   u32 mlx5e_choose_lro_timeout(struct mlx5_core_dev *mdev, u32 
> > wanted_timeout)
> > @@ -4100,9 +4100,9 @@ void mlx5e_build_nic_params(struct mlx5_core_dev 
> > *mdev,
> >     /* CQ moderation params */
> >     cq_period_mode = MLX5_CAP_GEN(mdev, cq_period_start_from_cqe) ?
> > -                   MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
> > -                   MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
> > -   params->rx_am_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
> > +                   NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE :
> > +                   NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
> > +   params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
> >     mlx5e_set_rx_cq_mode_params(params, cq_period_mode);
> >     mlx5e_set_tx_cq_mode_params(params, cq_period_mode);
> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c 
> > b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
> > index c6a77f8..ccb038f 100644
> > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
> > @@ -877,8 +877,8 @@ static void mlx5e_build_rep_params(struct mlx5_core_dev 
> > *mdev,
> >                                struct mlx5e_params *params)
> >   {
> >     u8 cq_period_mode = MLX5_CAP_GEN(mdev, cq_period_start_from_cqe) ?
> > -                                    MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
> > -                                    MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
> > +                                    NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE :
> > +                                    NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
> >     params->log_sq_size = MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE;
> >     params->rq_wq_type  = MLX5_WQ_TYPE_LINKED_LIST;
> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c 
> > b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
> > index 1849169..dae77a9 100644
> > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
> > @@ -79,7 +79,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
> >             mlx5e_cq_arm(&c->sq[i].cq);
> >     if (MLX5E_TEST_BIT(c->rq.state, MLX5E_RQ_STATE_AM))
> > -           mlx5e_rx_am(&c->rq.am,
> > +           net_dim(&c->rq.dim,
> >                         c->rq.cq.event_ctr,
> >                         c->rq.stats.packets,
> >                         c->rq.stats.bytes);
> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/net_dim.c 
> > b/drivers/net/ethernet/mellanox/mlx5/core/net_dim.c
> > index ca05f4e..00b9ae3 100644
> > --- a/drivers/net/ethernet/mellanox/mlx5/core/net_dim.c
> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/net_dim.c
> > @@ -33,22 +33,22 @@
> >   #include "en.h"
> > -#define MLX5E_PARAMS_AM_NUM_PROFILES 5
> > +#define NET_DIM_PARAMS_NUM_PROFILES 5
> >   /* Adaptive moderation profiles */
> > -#define MLX5E_AM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
> > -#define MLX5E_RX_AM_DEF_PROFILE_CQE 1
> > -#define MLX5E_RX_AM_DEF_PROFILE_EQE 1
> > -
> > -/* All profiles sizes must be MLX5E_PARAMS_AM_NUM_PROFILES */
> > -#define MLX5_AM_EQE_PROFILES { \
> > -   {1,   MLX5E_AM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > -   {8,   MLX5E_AM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > -   {64,  MLX5E_AM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > -   {128, MLX5E_AM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > -   {256, MLX5E_AM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > +#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
> > +#define NET_DIM_DEF_PROFILE_CQE 1
> > +#define NET_DIM_DEF_PROFILE_EQE 1
> > +
> > +/* All profiles sizes must be NET_PARAMS_DIM_NUM_PROFILES */
> > +#define NET_DIM_EQE_PROFILES { \
> > +   {1,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > +   {8,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > +   {64,  NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > +   {128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> > +   {256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
> >   }
> > -#define MLX5_AM_CQE_PROFILES { \
> > +#define NET_DIM_CQE_PROFILES { \
> >     {2,  256},             \
> >     {8,  128},             \
> >     {16, 64},              \
> > @@ -56,193 +56,193 @@
> >     {64, 64}               \
> >   }
> > -static const struct mlx5e_cq_moder
> > -profile[MLX5_CQ_PERIOD_NUM_MODES][MLX5E_PARAMS_AM_NUM_PROFILES] = {
> > -   MLX5_AM_EQE_PROFILES,
> > -   MLX5_AM_CQE_PROFILES,
> > +static const struct net_dim_cq_moder
> > +profile[NET_DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
> > +   NET_DIM_EQE_PROFILES,
> > +   NET_DIM_CQE_PROFILES,
> >   };
> > -struct mlx5e_cq_moder mlx5e_am_get_profile(u8 cq_period_mode, int ix)
> > +struct net_dim_cq_moder net_dim_get_profile(u8 cq_period_mode, int ix)
> >   {
> > -   struct mlx5e_cq_moder cq_moder;
> > +   struct net_dim_cq_moder cq_moder;
> >     cq_moder = profile[cq_period_mode][ix];
> >     cq_moder.cq_period_mode = cq_period_mode;
> >     return cq_moder;
> >   }
> > -struct mlx5e_cq_moder mlx5e_am_get_def_profile(u8 rx_cq_period_mode)
> > +struct net_dim_cq_moder net_dim_get_def_profile(u8 rx_cq_period_mode)
> >   {
> >     int default_profile_ix;
> > -   if (rx_cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE)
> > -           default_profile_ix = MLX5E_RX_AM_DEF_PROFILE_CQE;
> > -   else /* MLX5_CQ_PERIOD_MODE_START_FROM_EQE */
> > -           default_profile_ix = MLX5E_RX_AM_DEF_PROFILE_EQE;
> > +   if (rx_cq_period_mode == NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE)
> > +           default_profile_ix = NET_DIM_DEF_PROFILE_CQE;
> > +   else /* NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE */
> > +           default_profile_ix = NET_DIM_DEF_PROFILE_EQE;
> > -   return mlx5e_am_get_profile(rx_cq_period_mode, default_profile_ix);
> > +   return net_dim_get_profile(rx_cq_period_mode, default_profile_ix);
> >   }
> > -static bool mlx5e_am_on_top(struct mlx5e_rx_am *am)
> > +static bool net_dim_on_top(struct net_dim *dim)
> >   {
> > -   switch (am->tune_state) {
> > -   case MLX5E_AM_PARKING_ON_TOP:
> > -   case MLX5E_AM_PARKING_TIRED:
> > +   switch (dim->tune_state) {
> > +   case NET_DIM_PARKING_ON_TOP:
> > +   case NET_DIM_PARKING_TIRED:
> >             return true;
> > -   case MLX5E_AM_GOING_RIGHT:
> > -           return (am->steps_left > 1) && (am->steps_right == 1);
> > -   default: /* MLX5E_AM_GOING_LEFT */
> > -           return (am->steps_right > 1) && (am->steps_left == 1);
> > +   case NET_DIM_GOING_RIGHT:
> > +           return (dim->steps_left > 1) && (dim->steps_right == 1);
> > +   default: /* NET_DIM_GOING_LEFT */
> > +           return (dim->steps_right > 1) && (dim->steps_left == 1);
> >     }
> >   }
> > -static void mlx5e_am_turn(struct mlx5e_rx_am *am)
> > +static void net_dim_turn(struct net_dim *dim)
> >   {
> > -   switch (am->tune_state) {
> > -   case MLX5E_AM_PARKING_ON_TOP:
> > -   case MLX5E_AM_PARKING_TIRED:
> > +   switch (dim->tune_state) {
> > +   case NET_DIM_PARKING_ON_TOP:
> > +   case NET_DIM_PARKING_TIRED:
> >             break;
> > -   case MLX5E_AM_GOING_RIGHT:
> > -           am->tune_state = MLX5E_AM_GOING_LEFT;
> > -           am->steps_left = 0;
> > +   case NET_DIM_GOING_RIGHT:
> > +           dim->tune_state = NET_DIM_GOING_LEFT;
> > +           dim->steps_left = 0;
> >             break;
> > -   case MLX5E_AM_GOING_LEFT:
> > -           am->tune_state = MLX5E_AM_GOING_RIGHT;
> > -           am->steps_right = 0;
> > +   case NET_DIM_GOING_LEFT:
> > +           dim->tune_state = NET_DIM_GOING_RIGHT;
> > +           dim->steps_right = 0;
> >             break;
> >     }
> >   }
> > -static int mlx5e_am_step(struct mlx5e_rx_am *am)
> > +static int net_dim_step(struct net_dim *dim)
> >   {
> > -   if (am->tired == (MLX5E_PARAMS_AM_NUM_PROFILES * 2))
> > -           return MLX5E_AM_TOO_TIRED;
> > +   if (dim->tired == (NET_DIM_PARAMS_NUM_PROFILES * 2))
> > +           return NET_DIM_TOO_TIRED;
> > -   switch (am->tune_state) {
> > -   case MLX5E_AM_PARKING_ON_TOP:
> > -   case MLX5E_AM_PARKING_TIRED:
> > +   switch (dim->tune_state) {
> > +   case NET_DIM_PARKING_ON_TOP:
> > +   case NET_DIM_PARKING_TIRED:
> >             break;
> > -   case MLX5E_AM_GOING_RIGHT:
> > -           if (am->profile_ix == (MLX5E_PARAMS_AM_NUM_PROFILES - 1))
> > -                   return MLX5E_AM_ON_EDGE;
> > -           am->profile_ix++;
> > -           am->steps_right++;
> > +   case NET_DIM_GOING_RIGHT:
> > +           if (dim->profile_ix == (NET_DIM_PARAMS_NUM_PROFILES - 1))
> > +                   return NET_DIM_ON_EDGE;
> > +           dim->profile_ix++;
> > +           dim->steps_right++;
> >             break;
> > -   case MLX5E_AM_GOING_LEFT:
> > -           if (am->profile_ix == 0)
> > -                   return MLX5E_AM_ON_EDGE;
> > -           am->profile_ix--;
> > -           am->steps_left++;
> > +   case NET_DIM_GOING_LEFT:
> > +           if (dim->profile_ix == 0)
> > +                   return NET_DIM_ON_EDGE;
> > +           dim->profile_ix--;
> > +           dim->steps_left++;
> >             break;
> >     }
> > -   am->tired++;
> > -   return MLX5E_AM_STEPPED;
> > +   dim->tired++;
> > +   return NET_DIM_STEPPED;
> >   }
> > -static void mlx5e_am_park_on_top(struct mlx5e_rx_am *am)
> > +static void net_dim_park_on_top(struct net_dim *dim)
> >   {
> > -   am->steps_right  = 0;
> > -   am->steps_left   = 0;
> > -   am->tired        = 0;
> > -   am->tune_state   = MLX5E_AM_PARKING_ON_TOP;
> > +   dim->steps_right  = 0;
> > +   dim->steps_left   = 0;
> > +   dim->tired        = 0;
> > +   dim->tune_state   = NET_DIM_PARKING_ON_TOP;
> >   }
> > -static void mlx5e_am_park_tired(struct mlx5e_rx_am *am)
> > +static void net_dim_park_tired(struct net_dim *dim)
> >   {
> > -   am->steps_right  = 0;
> > -   am->steps_left   = 0;
> > -   am->tune_state   = MLX5E_AM_PARKING_TIRED;
> > +   dim->steps_right  = 0;
> > +   dim->steps_left   = 0;
> > +   dim->tune_state   = NET_DIM_PARKING_TIRED;
> >   }
> > -static void mlx5e_am_exit_parking(struct mlx5e_rx_am *am)
> > +static void net_dim_exit_parking(struct net_dim *dim)
> >   {
> > -   am->tune_state = am->profile_ix ? MLX5E_AM_GOING_LEFT :
> > -                                     MLX5E_AM_GOING_RIGHT;
> > -   mlx5e_am_step(am);
> > +   dim->tune_state = dim->profile_ix ? NET_DIM_GOING_LEFT :
> > +                                     NET_DIM_GOING_RIGHT;
> > +   net_dim_step(dim);
> >   }
> >   #define IS_SIGNIFICANT_DIFF(val, ref) \
> >     (((100 * abs((val) - (ref))) / (ref)) > 10) /* more than 10% difference 
> > */
> > -static int mlx5e_am_stats_compare(struct mlx5e_rx_am_stats *curr,
> > -                             struct mlx5e_rx_am_stats *prev)
> > +static int net_dim_stats_compare(struct net_dim_stats *curr,
> > +                              struct net_dim_stats *prev)
> >   {
> >     if (!prev->bpms)
> > -           return curr->bpms ? MLX5E_AM_STATS_BETTER :
> > -                               MLX5E_AM_STATS_SAME;
> > +           return curr->bpms ? NET_DIM_STATS_BETTER :
> > +                               NET_DIM_STATS_SAME;
> >     if (IS_SIGNIFICANT_DIFF(curr->bpms, prev->bpms))
> > -           return (curr->bpms > prev->bpms) ? MLX5E_AM_STATS_BETTER :
> > -                                              MLX5E_AM_STATS_WORSE;
> > +           return (curr->bpms > prev->bpms) ? NET_DIM_STATS_BETTER :
> > +                                              NET_DIM_STATS_WORSE;
> >     if (IS_SIGNIFICANT_DIFF(curr->ppms, prev->ppms))
> > -           return (curr->ppms > prev->ppms) ? MLX5E_AM_STATS_BETTER :
> > -                                              MLX5E_AM_STATS_WORSE;
> > +           return (curr->ppms > prev->ppms) ? NET_DIM_STATS_BETTER :
> > +                                              NET_DIM_STATS_WORSE;
> >     if (IS_SIGNIFICANT_DIFF(curr->epms, prev->epms))
> > -           return (curr->epms < prev->epms) ? MLX5E_AM_STATS_BETTER :
> > -                                              MLX5E_AM_STATS_WORSE;
> > +           return (curr->epms < prev->epms) ? NET_DIM_STATS_BETTER :
> > +                                              NET_DIM_STATS_WORSE;
> > -   return MLX5E_AM_STATS_SAME;
> > +   return NET_DIM_STATS_SAME;
> >   }
> > -static bool mlx5e_am_decision(struct mlx5e_rx_am_stats *curr_stats,
> > -                         struct mlx5e_rx_am *am)
> > +static bool net_dim_decision(struct net_dim_stats *curr_stats,
> > +                          struct net_dim *dim)
> >   {
> > -   int prev_state = am->tune_state;
> > -   int prev_ix = am->profile_ix;
> > +   int prev_state = dim->tune_state;
> > +   int prev_ix = dim->profile_ix;
> >     int stats_res;
> >     int step_res;
> > -   switch (am->tune_state) {
> > -   case MLX5E_AM_PARKING_ON_TOP:
> > -           stats_res = mlx5e_am_stats_compare(curr_stats, &am->prev_stats);
> > -           if (stats_res != MLX5E_AM_STATS_SAME)
> > -                   mlx5e_am_exit_parking(am);
> > +   switch (dim->tune_state) {
> > +   case NET_DIM_PARKING_ON_TOP:
> > +           stats_res = net_dim_stats_compare(curr_stats, &dim->prev_stats);
> > +           if (stats_res != NET_DIM_STATS_SAME)
> > +                   net_dim_exit_parking(dim);
> >             break;
> > -   case MLX5E_AM_PARKING_TIRED:
> > -           am->tired--;
> > -           if (!am->tired)
> > -                   mlx5e_am_exit_parking(am);
> > +   case NET_DIM_PARKING_TIRED:
> > +           dim->tired--;
> > +           if (!dim->tired)
> > +                   net_dim_exit_parking(dim);
> >             break;
> > -   case MLX5E_AM_GOING_RIGHT:
> > -   case MLX5E_AM_GOING_LEFT:
> > -           stats_res = mlx5e_am_stats_compare(curr_stats, &am->prev_stats);
> > -           if (stats_res != MLX5E_AM_STATS_BETTER)
> > -                   mlx5e_am_turn(am);
> > +   case NET_DIM_GOING_RIGHT:
> > +   case NET_DIM_GOING_LEFT:
> > +           stats_res = net_dim_stats_compare(curr_stats, &dim->prev_stats);
> > +           if (stats_res != NET_DIM_STATS_BETTER)
> > +                   net_dim_turn(dim);
> > -           if (mlx5e_am_on_top(am)) {
> > -                   mlx5e_am_park_on_top(am);
> > +           if (net_dim_on_top(dim)) {
> > +                   net_dim_park_on_top(dim);
> >                     break;
> >             }
> > -           step_res = mlx5e_am_step(am);
> > +           step_res = net_dim_step(dim);
> >             switch (step_res) {
> > -           case MLX5E_AM_ON_EDGE:
> > -                   mlx5e_am_park_on_top(am);
> > +           case NET_DIM_ON_EDGE:
> > +                   net_dim_park_on_top(dim);
> >                     break;
> > -           case MLX5E_AM_TOO_TIRED:
> > -                   mlx5e_am_park_tired(am);
> > +           case NET_DIM_TOO_TIRED:
> > +                   net_dim_park_tired(dim);
> >                     break;
> >             }
> >             break;
> >     }
> > -   if ((prev_state     != MLX5E_AM_PARKING_ON_TOP) ||
> > -       (am->tune_state != MLX5E_AM_PARKING_ON_TOP))
> > -           am->prev_stats = *curr_stats;
> > +   if ((prev_state     != NET_DIM_PARKING_ON_TOP) ||
> > +       (dim->tune_state != NET_DIM_PARKING_ON_TOP))
> > +           dim->prev_stats = *curr_stats;
> > -   return am->profile_ix != prev_ix;
> > +   return dim->profile_ix != prev_ix;
> >   }
> > -static void mlx5e_am_sample(u16 event_ctr,
> > -                       u64 packets,
> > -                       u64 bytes,
> > -                       struct mlx5e_rx_am_sample *s)
> > +static void net_dim_sample(u16 event_ctr,
> > +                      u64 packets,
> > +                      u64 bytes,
> > +                      struct net_dim_sample *s)
> >   {
> >     s->time      = ktime_get();
> >     s->pkt_ctr   = packets;
> > @@ -250,13 +250,13 @@ static void mlx5e_am_sample(u16 event_ctr,
> >     s->event_ctr = event_ctr;
> >   }
> > -#define MLX5E_AM_NEVENTS 64
> > +#define NET_DIM_NEVENTS 64
> >   #define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE)
> >   #define BIT_GAP(bits, end, start) ((((end) - (start)) + BIT_ULL(bits)) & 
> > (BIT_ULL(bits) - 1))
> > -static void mlx5e_am_calc_stats(struct mlx5e_rx_am_sample *start,
> > -                           struct mlx5e_rx_am_sample *end,
> > -                           struct mlx5e_rx_am_stats *curr_stats)
> > +static void net_dim_calc_stats(struct net_dim_sample *start,
> > +                          struct net_dim_sample *end,
> > +                          struct net_dim_stats *curr_stats)
> >   {
> >     /* u32 holds up to 71 minutes, should be enough */
> >     u32 delta_us = ktime_us_delta(end->time, start->time);
> > @@ -269,39 +269,39 @@ static void mlx5e_am_calc_stats(struct 
> > mlx5e_rx_am_sample *start,
> >     curr_stats->ppms = DIV_ROUND_UP(npkts * USEC_PER_MSEC, delta_us);
> >     curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us);
> > -   curr_stats->epms = DIV_ROUND_UP(MLX5E_AM_NEVENTS * USEC_PER_MSEC,
> > +   curr_stats->epms = DIV_ROUND_UP(NET_DIM_NEVENTS * USEC_PER_MSEC,
> >                                     delta_us);
> >   }
> > -void mlx5e_rx_am(struct mlx5e_rx_am *am,
> > -            u16 event_ctr,
> > -            u64 packets,
> > -            u64 bytes)
> > +void net_dim(struct net_dim *dim,
> > +        u16 event_ctr,
> > +        u64 packets,
> > +        u64 bytes)
> >   {
> > -   struct mlx5e_rx_am_sample end_sample;
> > -   struct mlx5e_rx_am_stats curr_stats;
> > +   struct net_dim_sample end_sample;
> > +   struct net_dim_stats curr_stats;
> >     u16 nevents;
> > -   switch (am->state) {
> > -   case MLX5E_AM_MEASURE_IN_PROGRESS:
> > +   switch (dim->state) {
> > +   case NET_DIM_MEASURE_IN_PROGRESS:
> >             nevents = BIT_GAP(BITS_PER_TYPE(u16), event_ctr,
> > -                             am->start_sample.event_ctr);
> > -           if (nevents < MLX5E_AM_NEVENTS)
> > +                             dim->start_sample.event_ctr);
> > +           if (nevents < NET_DIM_NEVENTS)
> >                     break;
> > -           mlx5e_am_sample(event_ctr, packets, bytes, &end_sample);
> > -           mlx5e_am_calc_stats(&am->start_sample, &end_sample,
> > +           net_dim_sample(event_ctr, packets, bytes, &end_sample);
> > +           net_dim_calc_stats(&dim->start_sample, &end_sample,
> >                                 &curr_stats);
> > -           if (mlx5e_am_decision(&curr_stats, am)) {
> > -                   am->state = MLX5E_AM_APPLY_NEW_PROFILE;
> > -                   schedule_work(&am->work);
> > +           if (net_dim_decision(&curr_stats, dim)) {
> > +                   dim->state = NET_DIM_APPLY_NEW_PROFILE;
> > +                   schedule_work(&dim->work);
> >                     break;
> >             }
> >             /* fall through */
> > -   case MLX5E_AM_START_MEASURE:
> > -           mlx5e_am_sample(event_ctr, packets, bytes, &am->start_sample);
> > -           am->state = MLX5E_AM_MEASURE_IN_PROGRESS;
> > +   case NET_DIM_START_MEASURE:
> > +           net_dim_sample(event_ctr, packets, bytes, &dim->start_sample);
> > +           dim->state = NET_DIM_MEASURE_IN_PROGRESS;
> >             break;
> > -   case MLX5E_AM_APPLY_NEW_PROFILE:
> > +   case NET_DIM_APPLY_NEW_PROFILE:
> >             break;
> >     }
> >   }
> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/net_dim.h 
> > b/drivers/net/ethernet/mellanox/mlx5/core/net_dim.h
> > index 5ce8e54..a775c12 100644
> > --- a/drivers/net/ethernet/mellanox/mlx5/core/net_dim.h
> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/net_dim.h
> > @@ -31,32 +31,32 @@
> >    * SOFTWARE.
> >   */
> > -#ifndef MLX5_AM_H
> > -#define MLX5_AM_H
> > +#ifndef NET_DIM_H
> > +#define NET_DIM_H
> > -struct mlx5e_cq_moder {
> > +struct net_dim_cq_moder {
> >     u16 usec;
> >     u16 pkts;
> >     u8 cq_period_mode;
> >   };
> > -struct mlx5e_rx_am_sample {
> > +struct net_dim_sample {
> >     ktime_t time;
> >     u32     pkt_ctr;
> >     u32     byte_ctr;
> >     u16     event_ctr;
> >   };
> > -struct mlx5e_rx_am_stats {
> > +struct net_dim_stats {
> >     int ppms; /* packets per msec */
> >     int bpms; /* bytes per msec */
> >     int epms; /* events per msec */
> >   };
> > -struct mlx5e_rx_am { /* Adaptive Moderation */
> > +struct net_dim { /* Adaptive Moderation */
> >     u8                                      state;
> > -   struct mlx5e_rx_am_stats                prev_stats;
> > -   struct mlx5e_rx_am_sample               start_sample;
> > +   struct net_dim_stats                    prev_stats;
> > +   struct net_dim_sample                   start_sample;
> >     struct work_struct                      work;
> >     u8                                      profile_ix;
> >     u8                                      mode;
> > @@ -67,43 +67,42 @@ struct mlx5e_rx_am { /* Adaptive Moderation */
> >   };
> >   enum {
> > -   MLX5_CQ_PERIOD_MODE_START_FROM_EQE = 0x0,
> > -   MLX5_CQ_PERIOD_MODE_START_FROM_CQE = 0x1,
> > -   MLX5_CQ_PERIOD_NUM_MODES
> > +   NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE = 0x0,
> > +   NET_DIM_CQ_PERIOD_MODE_START_FROM_CQE = 0x1,
> > +   NET_DIM_CQ_PERIOD_NUM_MODES
> >   };
> >   /* Adaptive moderation logic */
> >   enum {
> > -   MLX5E_AM_START_MEASURE,
> > -   MLX5E_AM_MEASURE_IN_PROGRESS,
> > -   MLX5E_AM_APPLY_NEW_PROFILE,
> > +   NET_DIM_START_MEASURE,
> > +   NET_DIM_MEASURE_IN_PROGRESS,
> > +   NET_DIM_APPLY_NEW_PROFILE,
> >   };
> >   enum {
> > -   MLX5E_AM_PARKING_ON_TOP,
> > -   MLX5E_AM_PARKING_TIRED,
> > -   MLX5E_AM_GOING_RIGHT,
> > -   MLX5E_AM_GOING_LEFT,
> > +   NET_DIM_PARKING_ON_TOP,
> > +   NET_DIM_PARKING_TIRED,
> > +   NET_DIM_GOING_RIGHT,
> > +   NET_DIM_GOING_LEFT,
> >   };
> >   enum {
> > -   MLX5E_AM_STATS_WORSE,
> > -   MLX5E_AM_STATS_SAME,
> > -   MLX5E_AM_STATS_BETTER,
> > +   NET_DIM_STATS_WORSE,
> > +   NET_DIM_STATS_SAME,
> > +   NET_DIM_STATS_BETTER,
> >   };
> >   enum {
> > -   MLX5E_AM_STEPPED,
> > -   MLX5E_AM_TOO_TIRED,
> > -   MLX5E_AM_ON_EDGE,
> > +   NET_DIM_STEPPED,
> > +   NET_DIM_TOO_TIRED,
> > +   NET_DIM_ON_EDGE,
> >   };
> > -void mlx5e_rx_am(struct mlx5e_rx_am *am,
> > -            u16 event_ctr,
> > -            u64 packets,
> > -            u64 bytes);
> > -void mlx5e_rx_am_work(struct work_struct *work);
> > -struct mlx5e_cq_moder mlx5e_am_get_def_profile(u8 rx_cq_period_mode);
> > -struct mlx5e_cq_moder mlx5e_am_get_profile(u8 cq_period_mode, int ix);
> > +void net_dim(struct net_dim *dim,
> > +        u16 event_ctr,
> > +        u64 packets,
> > +        u64 bytes);
> > +struct net_dim_cq_moder net_dim_get_def_profile(u8 rx_cq_period_mode);
> > +struct net_dim_cq_moder net_dim_get_profile(u8 cq_period_mode, int ix);
> > -#endif /* MLX5_AM_H */
> > +#endif /* NET_DIM_H */
> > 

Reply via email to