aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2015-12-07 11:04:50 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2015-12-07 11:04:50 +0000
commit74540a31837ec7a5bd968b8a42c041fd11c7535b (patch)
treebf531933eff45bbca8a3be7ec36cf66463cbfa3b
parent2a5ac376e4c310fcc9a348ef43e8781ea4c61d34 (diff)
downloadsrc-74540a31837ec7a5bd968b8a42c041fd11c7535b.tar.gz
src-74540a31837ec7a5bd968b8a42c041fd11c7535b.zip
Add support for setting the TX moderation mode via a sysctl entry. TX
completion events can be moderated in the same way like RX completion events. Expose this functionality by a sysctl variable. MFC after: 1 week Sponsored by: Mellanox Technologies Differential Revision: https://reviews.freebsd.org/D4409
Notes
Notes: svn path=/head/; revision=291932
-rw-r--r--sys/dev/mlx5/mlx5_en/en.h2
-rw-r--r--sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c6
-rw-r--r--sys/dev/mlx5/mlx5_en/mlx5_en_main.c14
3 files changed, 21 insertions, 1 deletions
diff --git a/sys/dev/mlx5/mlx5_en/en.h b/sys/dev/mlx5/mlx5_en/en.h
index 5339006d07ca..64976030c4ad 100644
--- a/sys/dev/mlx5/mlx5_en/en.h
+++ b/sys/dev/mlx5/mlx5_en/en.h
@@ -356,6 +356,7 @@ struct mlx5e_params {
u8 default_vlan_prio;
u8 num_tc;
u8 rx_cq_moderation_mode;
+ u8 tx_cq_moderation_mode;
u16 rx_cq_moderation_usec;
u16 rx_cq_moderation_pkts;
u16 tx_cq_moderation_usec;
@@ -381,6 +382,7 @@ struct mlx5e_params {
m(+1, u64 rx_coalesce_mode, "rx_coalesce_mode", "0: EQE mode 1: CQE mode") \
m(+1, u64 tx_coalesce_usecs, "tx_coalesce_usecs", "Limit in usec for joining tx packets") \
m(+1, u64 tx_coalesce_pkts, "tx_coalesce_pkts", "Maximum number of tx packets to join") \
+ m(+1, u64 tx_coalesce_mode, "tx_coalesce_mode", "0: EQE mode 1: CQE mode") \
m(+1, u64 hw_lro, "hw_lro", "set to enable hw_lro")
#define MLX5E_PARAMS_NUM (0 MLX5E_PARAMS(MLX5E_STATS_COUNT))
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c b/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
index 6a7b9116445a..eede82fe2363 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
@@ -136,6 +136,11 @@ mlx5e_ethtool_handler(SYSCTL_HANDLER_ARGS)
priv->params_ethtool.rx_coalesce_mode = 1;
priv->params.rx_cq_moderation_mode = priv->params_ethtool.rx_coalesce_mode;
+ /* import TX mode */
+ if (priv->params_ethtool.tx_coalesce_mode != 0)
+ priv->params_ethtool.tx_coalesce_mode = 1;
+ priv->params.tx_cq_moderation_mode = priv->params_ethtool.tx_coalesce_mode;
+
/* import RX coal time */
if (priv->params_ethtool.rx_coalesce_usecs < 1)
priv->params_ethtool.rx_coalesce_usecs = 0;
@@ -460,6 +465,7 @@ mlx5e_create_ethtool(struct mlx5e_priv *priv)
priv->params_ethtool.rx_coalesce_mode = priv->params.rx_cq_moderation_mode;
priv->params_ethtool.rx_coalesce_usecs = priv->params.rx_cq_moderation_usec;
priv->params_ethtool.rx_coalesce_pkts = priv->params.rx_cq_moderation_pkts;
+ priv->params_ethtool.tx_coalesce_mode = priv->params.tx_cq_moderation_mode;
priv->params_ethtool.tx_coalesce_usecs = priv->params.tx_cq_moderation_usec;
priv->params_ethtool.tx_coalesce_pkts = priv->params.tx_cq_moderation_pkts;
priv->params_ethtool.hw_lro = priv->params.hw_lro_en;
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
index 4e92eb6d8c72..71a708ea22eb 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -1324,13 +1324,25 @@ static int
mlx5e_open_tx_cqs(struct mlx5e_channel *c,
struct mlx5e_channel_param *cparam)
{
+ u8 tx_moderation_mode;
int err;
int tc;
+ switch (c->priv->params.tx_cq_moderation_mode) {
+ case 0:
+ tx_moderation_mode = MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
+ break;
+ default:
+ if (MLX5_CAP_GEN(c->priv->mdev, cq_period_start_from_cqe))
+ tx_moderation_mode = MLX5_CQ_PERIOD_MODE_START_FROM_CQE;
+ else
+ tx_moderation_mode = MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
+ break;
+ }
for (tc = 0; tc < c->num_tc; tc++) {
/* open completion queue */
err = mlx5e_open_cq(c, &cparam->tx_cq, &c->sq[tc].cq,
- &mlx5e_tx_cq_comp, MLX5_CQ_PERIOD_MODE_START_FROM_EQE);
+ &mlx5e_tx_cq_comp, tx_moderation_mode);
if (err)
goto err_close_tx_cqs;
}