Skip to content

Commit 0088cbb

Browse files
talgimellanoxSaeed Mahameed
authored andcommitted
net/mlx5e: Enable CQE based moderation on TX CQ
By using CQE based moderation on TX CQ we can reduce the number of TX interrupt rate. Besides the benefit of less interrupts, this also allows the kernel to better utilize TSO. Since TSO has some CPU overhead, it might not aggregate when CPU is under high stress. By reducing the interrupt rate and the CPU utilization, we can get better aggregation and better overall throughput. The feature is enabled by default and has a private flag in ethtool for control. Throughput, interrupt rate and TSO utilization improvements: (ConnectX-4Lx 40GbE, unidirectional, 1/16 TCP streams, 64B packets) --------------------------------------------------------- Metric | Streams | CQE Based | EQE Based | improvement --------------------------------------------------------- BW | 1 | 2.4Gb/s | 2.15Gb/s | +11.6% IR | 1 | 27Kips | 50.6Kips | -46.7% TSO Util | 1 | 74.6% | 71% | +5% BW | 16 | 29Gb/s | 25.85Gb/s | +12.2% IR | 16 | 482Kips | 745Kips | -35.3% TSO Util | 16 | 69.1% | 49% | +41.1% *BW = Bandwidth, IR = Interrupt rate, ips = interrupt per second. TSO Util = bytes in TSO sessions / all bytes transferred Signed-off-by: Tal Gilboa <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 458821c commit 0088cbb

File tree

4 files changed

+71
-23
lines changed

4 files changed

+71
-23
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
#define MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_USEC_FROM_CQE 0x3
107107
#define MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_PKTS 0x20
108108
#define MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC 0x10
109+
#define MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC_FROM_CQE 0x10
109110
#define MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_PKTS 0x20
110111
#define MLX5E_PARAMS_DEFAULT_MIN_RX_WQES 0x80
111112
#define MLX5E_PARAMS_DEFAULT_MIN_RX_WQES_MPW 0x2
@@ -198,12 +199,14 @@ extern const char mlx5e_self_tests[][ETH_GSTRING_LEN];
198199

199200
static const char mlx5e_priv_flags[][ETH_GSTRING_LEN] = {
200201
"rx_cqe_moder",
202+
"tx_cqe_moder",
201203
"rx_cqe_compress",
202204
};
203205

204206
enum mlx5e_priv_flag {
205207
MLX5E_PFLAG_RX_CQE_BASED_MODER = (1 << 0),
206-
MLX5E_PFLAG_RX_CQE_COMPRESS = (1 << 1),
208+
MLX5E_PFLAG_TX_CQE_BASED_MODER = (1 << 1),
209+
MLX5E_PFLAG_RX_CQE_COMPRESS = (1 << 2),
207210
};
208211

209212
#define MLX5E_SET_PFLAG(params, pflag, enable) \
@@ -223,6 +226,7 @@ enum mlx5e_priv_flag {
223226
struct mlx5e_cq_moder {
224227
u16 usec;
225228
u16 pkts;
229+
u8 cq_period_mode;
226230
};
227231

228232
struct mlx5e_params {
@@ -234,7 +238,6 @@ struct mlx5e_params {
234238
u8 log_rq_size;
235239
u16 num_channels;
236240
u8 num_tc;
237-
u8 rx_cq_period_mode;
238241
bool rx_cqe_compress_def;
239242
struct mlx5e_cq_moder rx_cq_moderation;
240243
struct mlx5e_cq_moder tx_cq_moderation;
@@ -926,6 +929,8 @@ void mlx5e_build_default_indir_rqt(u32 *indirection_rqt, int len,
926929
int num_channels);
927930
int mlx5e_get_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
928931

932+
void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params,
933+
u8 cq_period_mode);
929934
void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params,
930935
u8 cq_period_mode);
931936
void mlx5e_set_rq_type_params(struct mlx5_core_dev *mdev,

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,29 +1454,36 @@ static int mlx5e_get_module_eeprom(struct net_device *netdev,
14541454

14551455
typedef int (*mlx5e_pflag_handler)(struct net_device *netdev, bool enable);
14561456

1457-
static int set_pflag_rx_cqe_based_moder(struct net_device *netdev, bool enable)
1457+
static int set_pflag_cqe_based_moder(struct net_device *netdev, bool enable,
1458+
bool is_rx_cq)
14581459
{
14591460
struct mlx5e_priv *priv = netdev_priv(netdev);
14601461
struct mlx5_core_dev *mdev = priv->mdev;
14611462
struct mlx5e_channels new_channels = {};
1462-
bool rx_mode_changed;
1463-
u8 rx_cq_period_mode;
1463+
bool mode_changed;
1464+
u8 cq_period_mode, current_cq_period_mode;
14641465
int err = 0;
14651466

1466-
rx_cq_period_mode = enable ?
1467+
cq_period_mode = enable ?
14671468
MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
14681469
MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
1469-
rx_mode_changed = rx_cq_period_mode != priv->channels.params.rx_cq_period_mode;
1470+
current_cq_period_mode = is_rx_cq ?
1471+
priv->channels.params.rx_cq_moderation.cq_period_mode :
1472+
priv->channels.params.tx_cq_moderation.cq_period_mode;
1473+
mode_changed = cq_period_mode != current_cq_period_mode;
14701474

1471-
if (rx_cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE &&
1475+
if (cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE &&
14721476
!MLX5_CAP_GEN(mdev, cq_period_start_from_cqe))
14731477
return -EOPNOTSUPP;
14741478

1475-
if (!rx_mode_changed)
1479+
if (!mode_changed)
14761480
return 0;
14771481

14781482
new_channels.params = priv->channels.params;
1479-
mlx5e_set_rx_cq_mode_params(&new_channels.params, rx_cq_period_mode);
1483+
if (is_rx_cq)
1484+
mlx5e_set_rx_cq_mode_params(&new_channels.params, cq_period_mode);
1485+
else
1486+
mlx5e_set_tx_cq_mode_params(&new_channels.params, cq_period_mode);
14801487

14811488
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
14821489
priv->channels.params = new_channels.params;
@@ -1491,6 +1498,16 @@ static int set_pflag_rx_cqe_based_moder(struct net_device *netdev, bool enable)
14911498
return 0;
14921499
}
14931500

1501+
static int set_pflag_tx_cqe_based_moder(struct net_device *netdev, bool enable)
1502+
{
1503+
return set_pflag_cqe_based_moder(netdev, enable, false);
1504+
}
1505+
1506+
static int set_pflag_rx_cqe_based_moder(struct net_device *netdev, bool enable)
1507+
{
1508+
return set_pflag_cqe_based_moder(netdev, enable, true);
1509+
}
1510+
14941511
int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool new_val)
14951512
{
14961513
bool curr_val = MLX5E_GET_PFLAG(&priv->channels.params, MLX5E_PFLAG_RX_CQE_COMPRESS);
@@ -1578,6 +1595,12 @@ static int mlx5e_set_priv_flags(struct net_device *netdev, u32 pflags)
15781595
if (err)
15791596
goto out;
15801597

1598+
err = mlx5e_handle_pflag(netdev, pflags,
1599+
MLX5E_PFLAG_TX_CQE_BASED_MODER,
1600+
set_pflag_tx_cqe_based_moder);
1601+
if (err)
1602+
goto out;
1603+
15811604
err = mlx5e_handle_pflag(netdev, pflags,
15821605
MLX5E_PFLAG_RX_CQE_COMPRESS,
15831606
set_pflag_rx_cqe_compress);

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c,
681681
}
682682

683683
INIT_WORK(&rq->am.work, mlx5e_rx_am_work);
684-
rq->am.mode = params->rx_cq_period_mode;
684+
rq->am.mode = params->rx_cq_moderation.cq_period_mode;
685685
rq->page_cache.head = 0;
686686
rq->page_cache.tail = 0;
687687

@@ -1974,7 +1974,7 @@ static void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
19741974
}
19751975

19761976
mlx5e_build_common_cq_param(priv, param);
1977-
param->cq_period_mode = params->rx_cq_period_mode;
1977+
param->cq_period_mode = params->rx_cq_moderation.cq_period_mode;
19781978
}
19791979

19801980
static void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv,
@@ -1986,8 +1986,7 @@ static void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv,
19861986
MLX5_SET(cqc, cqc, log_cq_size, params->log_sq_size);
19871987

19881988
mlx5e_build_common_cq_param(priv, param);
1989-
1990-
param->cq_period_mode = MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
1989+
param->cq_period_mode = params->tx_cq_moderation.cq_period_mode;
19911990
}
19921991

19931992
static void mlx5e_build_ico_cq_param(struct mlx5e_priv *priv,
@@ -3987,25 +3986,44 @@ static bool hw_lro_heuristic(u32 link_speed, u32 pci_bw)
39873986
(pci_bw <= 16000) && (pci_bw < link_speed));
39883987
}
39893988

3989+
void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode)
3990+
{
3991+
params->tx_cq_moderation.cq_period_mode = cq_period_mode;
3992+
3993+
params->tx_cq_moderation.pkts =
3994+
MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_PKTS;
3995+
params->tx_cq_moderation.usec =
3996+
MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC;
3997+
3998+
if (cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE)
3999+
params->tx_cq_moderation.usec =
4000+
MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC_FROM_CQE;
4001+
4002+
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_TX_CQE_BASED_MODER,
4003+
params->tx_cq_moderation.cq_period_mode ==
4004+
MLX5_CQ_PERIOD_MODE_START_FROM_CQE);
4005+
}
4006+
39904007
void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode)
39914008
{
3992-
params->rx_cq_period_mode = cq_period_mode;
4009+
params->rx_cq_moderation.cq_period_mode = cq_period_mode;
39934010

39944011
params->rx_cq_moderation.pkts =
39954012
MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_PKTS;
39964013
params->rx_cq_moderation.usec =
3997-
MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_USEC;
4014+
MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_USEC;
39984015

39994016
if (cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE)
40004017
params->rx_cq_moderation.usec =
40014018
MLX5E_PARAMS_DEFAULT_RX_CQ_MODERATION_USEC_FROM_CQE;
40024019

40034020
if (params->rx_am_enabled)
40044021
params->rx_cq_moderation =
4005-
mlx5e_am_get_def_profile(params->rx_cq_period_mode);
4022+
mlx5e_am_get_def_profile(cq_period_mode);
40064023

40074024
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_CQE_BASED_MODER,
4008-
params->rx_cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE);
4025+
params->rx_cq_moderation.cq_period_mode ==
4026+
MLX5_CQ_PERIOD_MODE_START_FROM_CQE);
40094027
}
40104028

40114029
u32 mlx5e_choose_lro_timeout(struct mlx5_core_dev *mdev, u32 wanted_timeout)
@@ -4065,9 +4083,7 @@ void mlx5e_build_nic_params(struct mlx5_core_dev *mdev,
40654083
MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
40664084
params->rx_am_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
40674085
mlx5e_set_rx_cq_mode_params(params, cq_period_mode);
4068-
4069-
params->tx_cq_moderation.usec = MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_USEC;
4070-
params->tx_cq_moderation.pkts = MLX5E_PARAMS_DEFAULT_TX_CQ_MODERATION_PKTS;
4086+
mlx5e_set_tx_cq_mode_params(params, cq_period_mode);
40714087

40724088
/* TX inline */
40734089
params->tx_max_inline = mlx5e_get_max_inline_cap(mdev);

drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ profile[MLX5_CQ_PERIOD_NUM_MODES][MLX5E_PARAMS_AM_NUM_PROFILES] = {
6363

6464
static inline struct mlx5e_cq_moder mlx5e_am_get_profile(u8 cq_period_mode, int ix)
6565
{
66-
return profile[cq_period_mode][ix];
66+
struct mlx5e_cq_moder cq_moder;
67+
68+
cq_moder = profile[cq_period_mode][ix];
69+
cq_moder.cq_period_mode = cq_period_mode;
70+
return cq_moder;
6771
}
6872

6973
struct mlx5e_cq_moder mlx5e_am_get_def_profile(u8 rx_cq_period_mode)
@@ -75,7 +79,7 @@ struct mlx5e_cq_moder mlx5e_am_get_def_profile(u8 rx_cq_period_mode)
7579
else /* MLX5_CQ_PERIOD_MODE_START_FROM_EQE */
7680
default_profile_ix = MLX5E_RX_AM_DEF_PROFILE_EQE;
7781

78-
return profile[rx_cq_period_mode][default_profile_ix];
82+
return mlx5e_am_get_profile(rx_cq_period_mode, default_profile_ix);
7983
}
8084

8185
/* Adaptive moderation logic */

0 commit comments

Comments
 (0)