The branch main has been updated by hselasky:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=8e332232a5ac8b11fb1c34c70f48bf586267ffda

commit 8e332232a5ac8b11fb1c34c70f48bf586267ffda
Author:     Hans Petter Selasky <[email protected]>
AuthorDate: 2022-02-01 15:20:15 +0000
Commit:     Hans Petter Selasky <[email protected]>
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);

Reply via email to