git: 8e332232a5ac - main - mlx5en: Implement one RQT object per channel.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 01 Feb 2022 15:24:37 UTC
The branch main has been updated by hselasky:
URL: https://cgit.FreeBSD.org/src/commit/?id=8e332232a5ac8b11fb1c34c70f48bf586267ffda
commit 8e332232a5ac8b11fb1c34c70f48bf586267ffda
Author: Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2022-02-01 15:20:15 +0000
Commit: Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2022-02-01 15:21:17 +0000
mlx5en: Implement one RQT object per channel.
These objects will eventually be used to switch TLS RX traffic.
MFC after: 1 week
Sponsored by: NVIDIA Networking
---
sys/dev/mlx5/mlx5_en/en.h | 1 +
sys/dev/mlx5/mlx5_en/mlx5_en_main.c | 110 +++++++++++++++++++++++++++++++-----
2 files changed, 96 insertions(+), 15 deletions(-)
diff --git a/sys/dev/mlx5/mlx5_en/en.h b/sys/dev/mlx5/mlx5_en/en.h
index c7e15b8968ba..50215defdf60 100644
--- a/sys/dev/mlx5/mlx5_en/en.h
+++ b/sys/dev/mlx5/mlx5_en/en.h
@@ -926,6 +926,7 @@ struct mlx5e_channel {
struct mlx5e_priv *priv;
struct completion completion;
int ix;
+ u32 rqtn;
} __aligned(MLX5E_CACHELINE_SIZE);
enum mlx5e_traffic_types {
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
index eec7c9cc9730..ed0b72084dc7 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -2751,17 +2751,14 @@ mlx5e_close_tises(struct mlx5e_priv *priv)
}
static int
-mlx5e_open_rqt(struct mlx5e_priv *priv)
+mlx5e_open_default_rqt(struct mlx5e_priv *priv, u32 *prqtn, int sz)
{
u32 *in;
void *rqtc;
int inlen;
int err;
- int sz;
int i;
- sz = 1 << priv->params.rx_hash_log_tbl_sz;
-
inlen = MLX5_ST_SZ_BYTES(create_rqt_in) + sizeof(u32) * sz;
in = mlx5_vzalloc(inlen);
if (in == NULL)
@@ -2774,12 +2771,51 @@ mlx5e_open_rqt(struct mlx5e_priv *priv)
for (i = 0; i != sz; i++)
MLX5_SET(rqtc, rqtc, rq_num[i], priv->drop_rq.rqn);
- err = mlx5_core_create_rqt(priv->mdev, in, inlen, &priv->rqtn);
+ err = mlx5_core_create_rqt(priv->mdev, in, inlen, prqtn);
kvfree(in);
return (err);
}
+static int
+mlx5e_open_rqts(struct mlx5e_priv *priv)
+{
+ int err;
+ int i;
+
+ err = mlx5e_open_default_rqt(priv, &priv->rqtn,
+ 1 << priv->params.rx_hash_log_tbl_sz);
+ if (err)
+ goto err_default;
+
+ for (i = 0; i != priv->mdev->priv.eq_table.num_comp_vectors; i++) {
+ err = mlx5e_open_default_rqt(priv, &priv->channel[i].rqtn, 1);
+ if (err)
+ goto err_channel;
+ }
+ return (0);
+
+err_channel:
+ while (i--)
+ mlx5_core_destroy_rqt(priv->mdev, priv->channel[i].rqtn, 0);
+
+ mlx5_core_destroy_rqt(priv->mdev, priv->rqtn, 0);
+
+err_default:
+ return (err);
+}
+
+static void
+mlx5e_close_rqts(struct mlx5e_priv *priv)
+{
+ int i;
+
+ for (i = 0; i != priv->mdev->priv.eq_table.num_comp_vectors; i++)
+ mlx5_core_destroy_rqt(priv->mdev, priv->channel[i].rqtn, 0);
+
+ mlx5_core_destroy_rqt(priv->mdev, priv->rqtn, 0);
+}
+
static int
mlx5e_activate_rqt(struct mlx5e_priv *priv)
{
@@ -2803,9 +2839,11 @@ mlx5e_activate_rqt(struct mlx5e_priv *priv)
MLX5_SET(modify_rqt_in, in, bitmask.rqn_list, 1);
for (i = 0; i != sz; i++) {
- int ix = i;
+ int ix;
#ifdef RSS
- ix = rss_get_indirection_to_bucket(ix);
+ ix = rss_get_indirection_to_bucket(i);
+#else
+ ix = i;
#endif
/* ensure we don't overflow */
ix %= priv->params.num_channels;
@@ -2817,8 +2855,35 @@ mlx5e_activate_rqt(struct mlx5e_priv *priv)
}
err = mlx5_core_modify_rqt(priv->mdev, priv->rqtn, in, inlen);
- kvfree(in);
+ if (err)
+ goto err_modify;
+
+ inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + sizeof(u32);
+
+ MLX5_SET(rqtc, rqtc, rqt_actual_size, 1);
+ for (i = 0; i != priv->mdev->priv.eq_table.num_comp_vectors; i++) {
+ int ix;
+#ifdef RSS
+ ix = rss_get_indirection_to_bucket(i);
+#else
+ ix = i;
+#endif
+ /* ensure we don't overflow */
+ ix %= priv->params.num_channels;
+
+ /* apply receive side scaling stride, if any */
+ ix -= ix % (int)priv->params.channels_rsss;
+
+ MLX5_SET(rqtc, rqtc, rq_num[0], priv->channel[ix].rq.rqn);
+
+ err = mlx5_core_modify_rqt(priv->mdev, priv->channel[i].rqtn, in, inlen);
+ if (err)
+ goto err_modify;
+ }
+
+err_modify:
+ kvfree(in);
return (err);
}
@@ -2848,8 +2913,23 @@ mlx5e_deactivate_rqt(struct mlx5e_priv *priv)
MLX5_SET(rqtc, rqtc, rq_num[i], priv->drop_rq.rqn);
err = mlx5_core_modify_rqt(priv->mdev, priv->rqtn, in, inlen);
- kvfree(in);
+ if (err)
+ goto err_modify;
+
+ inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + sizeof(u32);
+
+ MLX5_SET(rqtc, rqtc, rqt_actual_size, 1);
+ for (i = 0; i != priv->mdev->priv.eq_table.num_comp_vectors; i++) {
+ MLX5_SET(rqtc, rqtc, rq_num[0], priv->drop_rq.rqn);
+
+ err = mlx5_core_modify_rqt(priv->mdev, priv->channel[i].rqtn, in, inlen);
+ if (err)
+ goto err_modify;
+ }
+
+err_modify:
+ kvfree(in);
return (err);
}
@@ -4546,16 +4626,16 @@ mlx5e_create_ifp(struct mlx5_core_dev *mdev)
goto err_tls_init;
}
- err = mlx5e_open_rqt(priv);
+ err = mlx5e_open_rqts(priv);
if (err) {
- if_printf(ifp, "%s: mlx5e_open_rqt failed (%d)\n", __func__, err);
+ if_printf(ifp, "%s: mlx5e_open_rqts failed (%d)\n", __func__, err);
goto err_open_drop_rq;
}
err = mlx5e_open_tirs(priv);
if (err) {
mlx5_en_err(ifp, "mlx5e_open_tirs() failed, %d\n", err);
- goto err_open_rqt;
+ goto err_open_rqts;
}
err = mlx5e_open_flow_tables(priv);
@@ -4702,8 +4782,8 @@ mlx5e_create_ifp(struct mlx5_core_dev *mdev)
err_open_tirs:
mlx5e_close_tirs(priv);
-err_open_rqt:
- mlx5_core_destroy_rqt(priv->mdev, priv->rqtn, 0);
+err_open_rqts:
+ mlx5e_close_rqts(priv);
err_open_drop_rq:
mlx5e_close_drop_rq(&priv->drop_rq);
@@ -4809,7 +4889,7 @@ mlx5e_destroy_ifp(struct mlx5_core_dev *mdev, void *vpriv)
mlx5e_close_flow_tables(priv);
mlx5e_close_tirs(priv);
- mlx5_core_destroy_rqt(priv->mdev, priv->rqtn, 0);
+ mlx5e_close_rqts(priv);
mlx5e_close_drop_rq(&priv->drop_rq);
mlx5e_tls_cleanup(priv);
mlx5e_rl_cleanup(priv);