]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5e: Fetch WQE: reuse code and enforce typing
authorMaxim Mikityanskiy <maximmi@mellanox.com>
Fri, 15 Nov 2019 11:48:38 +0000 (13:48 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 30 Apr 2020 17:10:45 +0000 (10:10 -0700)
There are multiple functions mlx5{e,i}_*_fetch_wqe that contain the same
code, that is repeated, because they operate on different SQ struct
types. mlx5e_sq_fetch_wqe also returns void *, instead of the concrete
WQE type.

This commit generalizes the fetch WQE operation by putting this code
into a single function. To simplify calls of the generic function in
concrete use cases, macros are provided that substitute the right WQE
size and cast the return type.

Before this patch, fetch_wqe used to calculate pi itself, but the value
was often known to the caller. This calculation is moved outside to
eliminate this unnecessary step and prepare for the fill_frag_edge
refactoring in the next patch.

Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h

index c0249fc77eaacf3a57246abf7316e910c94f7f7c..8682d9148ab94bee169d83bca127ba08aa1be818 100644 (file)
@@ -33,19 +33,19 @@ mlx5e_wqc_has_room_for(struct mlx5_wq_cyc *wq, u16 cc, u16 pc, u16 n)
        return (mlx5_wq_cyc_ctr2ix(wq, cc - pc) >= n) || (cc == pc);
 }
 
-static inline void *
-mlx5e_sq_fetch_wqe(struct mlx5e_txqsq *sq, size_t size, u16 *pi)
+static inline void *mlx5e_fetch_wqe(struct mlx5_wq_cyc *wq, u16 pi, size_t wqe_size)
 {
-       struct mlx5_wq_cyc *wq = &sq->wq;
        void *wqe;
 
-       *pi  = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
-       wqe = mlx5_wq_cyc_get_wqe(wq, *pi);
-       memset(wqe, 0, size);
+       wqe = mlx5_wq_cyc_get_wqe(wq, pi);
+       memset(wqe, 0, wqe_size);
 
        return wqe;
 }
 
+#define MLX5E_TX_FETCH_WQE(sq, pi) \
+       ((struct mlx5e_tx_wqe *)mlx5e_fetch_wqe(&(sq)->wq, pi, sizeof(struct mlx5e_tx_wqe)))
+
 static inline struct mlx5e_tx_wqe *
 mlx5e_post_nop(struct mlx5_wq_cyc *wq, u32 sqn, u16 *pc)
 {
index 6f32a697a4bf27899e97c132c788eb696a58d100..cf089520c031048694c9438cc5b9b202f9a6c979 100644 (file)
@@ -188,10 +188,12 @@ static void mlx5e_xdp_mpwqe_session_start(struct mlx5e_xdpsq *sq)
        pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
        contig_wqebbs = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
 
-       if (unlikely(contig_wqebbs < MLX5_SEND_WQE_MAX_WQEBBS))
+       if (unlikely(contig_wqebbs < MLX5_SEND_WQE_MAX_WQEBBS)) {
                mlx5e_fill_xdpsq_frag_edge(sq, wq, pi, contig_wqebbs);
+               pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
+       }
 
-       session->wqe = mlx5e_xdpsq_fetch_wqe(sq, &pi);
+       session->wqe = MLX5E_TX_FETCH_WQE(sq, pi);
 
        prefetchw(session->wqe->data);
        session->ds_count  = MLX5E_XDP_TX_EMPTY_DS_COUNT;
index d7587f40ecaecab577545f8796c6ade7da39abaa..4fd0ff47bdc3232eb47c33eb234377516be20d0a 100644 (file)
@@ -186,19 +186,6 @@ mlx5e_xdp_mpwqe_add_dseg(struct mlx5e_xdpsq *sq,
        session->ds_count++;
 }
 
-static inline struct mlx5e_tx_wqe *
-mlx5e_xdpsq_fetch_wqe(struct mlx5e_xdpsq *sq, u16 *pi)
-{
-       struct mlx5_wq_cyc *wq = &sq->wq;
-       struct mlx5e_tx_wqe *wqe;
-
-       *pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
-       wqe = mlx5_wq_cyc_get_wqe(wq, *pi);
-       memset(wqe, 0, sizeof(*wqe));
-
-       return wqe;
-}
-
 static inline void
 mlx5e_xdpi_fifo_push(struct mlx5e_xdp_info_fifo *fifo,
                     struct mlx5e_xdp_info *xi)
index 63116be6b1d60831ce770a5b7a5e8a2759df0384..9daaec24438510d7a41caf983863f3ffc3f13780 100644 (file)
@@ -27,6 +27,14 @@ struct mlx5e_dump_wqe {
        struct mlx5_wqe_data_seg data;
 };
 
+#define MLX5E_TLS_FETCH_UMR_WQE(sq, pi) \
+       ((struct mlx5e_umr_wqe *)mlx5e_fetch_wqe(&(sq)->wq, pi, MLX5E_KTLS_STATIC_UMR_WQE_SZ))
+#define MLX5E_TLS_FETCH_PROGRESS_WQE(sq, pi) \
+       ((struct mlx5e_tx_wqe *)mlx5e_fetch_wqe(&(sq)->wq, pi, MLX5E_KTLS_PROGRESS_WQE_SZ))
+#define MLX5E_TLS_FETCH_DUMP_WQE(sq, pi) \
+       ((struct mlx5e_dump_wqe *)mlx5e_fetch_wqe(&(sq)->wq, pi, \
+                                                 sizeof(struct mlx5e_dump_wqe)))
+
 #define MLX5E_KTLS_DUMP_WQEBBS \
        (DIV_ROUND_UP(sizeof(struct mlx5e_dump_wqe), MLX5_SEND_WQE_BB))
 
index 52a56622034a0b968dddf257473e13604b51425f..717d36b45aa9ce0303a48f1c679213bdaeff3d7a 100644 (file)
@@ -137,7 +137,8 @@ post_static_params(struct mlx5e_txqsq *sq,
        struct mlx5e_umr_wqe *umr_wqe;
        u16 pi;
 
-       umr_wqe = mlx5e_sq_fetch_wqe(sq, MLX5E_KTLS_STATIC_UMR_WQE_SZ, &pi);
+       pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+       umr_wqe = MLX5E_TLS_FETCH_UMR_WQE(sq, pi);
        build_static_params(umr_wqe, sq->pc, sq->sqn, priv_tx, fence);
        tx_fill_wi(sq, pi, MLX5E_KTLS_STATIC_WQEBBS, 0, NULL);
        sq->pc += MLX5E_KTLS_STATIC_WQEBBS;
@@ -151,7 +152,8 @@ post_progress_params(struct mlx5e_txqsq *sq,
        struct mlx5e_tx_wqe *wqe;
        u16 pi;
 
-       wqe = mlx5e_sq_fetch_wqe(sq, MLX5E_KTLS_PROGRESS_WQE_SZ, &pi);
+       pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+       wqe = MLX5E_TLS_FETCH_PROGRESS_WQE(sq, pi);
        build_progress_params(wqe, sq->pc, sq->sqn, priv_tx, fence);
        tx_fill_wi(sq, pi, MLX5E_KTLS_PROGRESS_WQEBBS, 0, NULL);
        sq->pc += MLX5E_KTLS_PROGRESS_WQEBBS;
@@ -278,7 +280,8 @@ tx_post_resync_dump(struct mlx5e_txqsq *sq, skb_frag_t *frag, u32 tisn, bool fir
        int fsz;
        u16 pi;
 
-       wqe = mlx5e_sq_fetch_wqe(sq, sizeof(*wqe), &pi);
+       pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+       wqe = MLX5E_TLS_FETCH_DUMP_WQE(sq, pi);
 
        ds_cnt = sizeof(*wqe) / MLX5_SEND_WQE_DS;
 
@@ -449,7 +452,8 @@ struct sk_buff *mlx5e_ktls_handle_tx_skb(struct net_device *netdev,
 
        if (unlikely(mlx5e_ktls_tx_offload_test_and_clear_pending(priv_tx))) {
                mlx5e_ktls_tx_post_param_wqes(sq, priv_tx, false, false);
-               *wqe = mlx5e_sq_fetch_wqe(sq, sizeof(**wqe), pi);
+               *pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+               *wqe = MLX5E_TX_FETCH_WQE(sq, *pi);
                stats->tls_ctx++;
        }
 
@@ -460,7 +464,8 @@ struct sk_buff *mlx5e_ktls_handle_tx_skb(struct net_device *netdev,
 
                switch (ret) {
                case MLX5E_KTLS_SYNC_DONE:
-                       *wqe = mlx5e_sq_fetch_wqe(sq, sizeof(**wqe), pi);
+                       *pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+                       *wqe = MLX5E_TX_FETCH_WQE(sq, *pi);
                        break;
                case MLX5E_KTLS_SYNC_SKIP_NO_DATA:
                        if (likely(!skb->decrypted))
index ef1ed15a53b46276ef48b2d9ac64f22875ec5879..1d7ddeb7a46b28bc7511d6d446fc2f8f1fb4b25c 100644 (file)
@@ -248,7 +248,8 @@ mlx5e_tls_handle_ooo(struct mlx5e_tls_offload_context_tx *context,
        mlx5e_tls_complete_sync_skb(skb, nskb, tcp_seq, headln,
                                    cpu_to_be64(info.rcd_sn));
        mlx5e_sq_xmit(sq, nskb, *wqe, *pi, true);
-       *wqe = mlx5e_sq_fetch_wqe(sq, sizeof(**wqe), pi);
+       *pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+       *wqe = MLX5E_TX_FETCH_WQE(sq, *pi);
        return skb;
 
 err_out:
index 1679557f34c04fb8028c66ff1915a4455dbf1d2d..ec1429596cb7b3da3ec47c3a5cf9ebf27938b3f5 100644 (file)
@@ -324,7 +324,8 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
                struct mlx5_wqe_ctrl_seg cur_ctrl = wqe->ctrl;
 #endif
                mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
-               wqe = mlx5e_sq_fetch_wqe(sq, sizeof(*wqe), &pi);
+               pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
+               wqe = MLX5E_TX_FETCH_WQE(sq, pi);
 #ifdef CONFIG_MLX5_EN_IPSEC
                wqe->eth = cur_eth;
 #endif
@@ -389,7 +390,8 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev)
        u16 pi;
 
        sq = priv->txq2sq[skb_get_queue_mapping(skb)];
-       wqe = mlx5e_sq_fetch_wqe(sq, sizeof(*wqe), &pi);
+       pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
+       wqe = MLX5E_TX_FETCH_WQE(sq, pi);
 
        /* might send skbs and update wqe and pi */
        skb = mlx5e_accel_handle_tx(skb, sq, dev, &wqe, &pi);
@@ -622,10 +624,10 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
        contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
        if (unlikely(contig_wqebbs_room < num_wqebbs)) {
                mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
-               pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
+               pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc);
        }
 
-       mlx5i_sq_fetch_wqe(sq, &wqe, pi);
+       wqe = MLX5I_SQ_FETCH_WQE(sq, pi);
 
        /* fill wqe */
        wi       = &sq->db.wqe_info[pi];
index 3483ba642cfe0ac14fd9657affd99d85274b65f8..7844ab5d0ce77d192d97d8ff34ba8d9c7bbfdc8b 100644 (file)
@@ -110,15 +110,8 @@ struct mlx5i_tx_wqe {
        struct mlx5_wqe_data_seg     data[];
 };
 
-static inline void mlx5i_sq_fetch_wqe(struct mlx5e_txqsq *sq,
-                                     struct mlx5i_tx_wqe **wqe,
-                                     u16 pi)
-{
-       struct mlx5_wq_cyc *wq = &sq->wq;
-
-       *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
-       memset(*wqe, 0, sizeof(**wqe));
-}
+#define MLX5I_SQ_FETCH_WQE(sq, pi) \
+       ((struct mlx5i_tx_wqe *)mlx5e_fetch_wqe(&(sq)->wq, pi, sizeof(struct mlx5i_tx_wqe)))
 
 netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
                          struct mlx5_av *av, u32 dqpn, u32 dqkey,