net/mlx5e: Unify constants for WQE_EMPTY_DS_COUNT
authorMaxim Mikityanskiy <maximmi@mellanox.com>
Thu, 9 Jul 2020 11:05:31 +0000 (14:05 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 22 Sep 2020 02:41:15 +0000 (19:41 -0700)
A constant for the number of DS in an empty WQE (i.e. a WQE without data
segments) is needed in multiple places (normal TX data path, MPWQE in
XDP), but currently we have a constant for XDP and an inline formula in
normal TX. This patch introduces a common constant.

Additionally, mlx5e_xdp_mpwqe_session_start is converted to use struct
assignment, because the code nearby is touched.

Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.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_tx.c

index 9931a60..277725c 100644 (file)
@@ -7,6 +7,8 @@
 #include "en.h"
 #include <linux/indirect_call_wrapper.h>
 
+#define MLX5E_TX_WQE_EMPTY_DS_COUNT (sizeof(struct mlx5e_tx_wqe) / MLX5_SEND_WQE_DS)
+
 #define INL_HDR_START_SZ (sizeof(((struct mlx5_wqe_eth_seg *)NULL)->inline_hdr.start))
 
 enum mlx5e_icosq_wqe_type {
index 7fccd2e..737e88d 100644 (file)
@@ -196,16 +196,19 @@ static void mlx5e_xdp_mpwqe_session_start(struct mlx5e_xdpsq *sq)
 {
        struct mlx5e_xdp_mpwqe *session = &sq->mpwqe;
        struct mlx5e_xdpsq_stats *stats = sq->stats;
+       struct mlx5e_tx_wqe *wqe;
        u16 pi;
 
        pi = mlx5e_xdpsq_get_next_pi(sq, MLX5E_XDP_MPW_MAX_WQEBBS);
-       session->wqe = MLX5E_TX_FETCH_WQE(sq, pi);
-
-       net_prefetchw(session->wqe->data);
-       session->ds_count  = MLX5E_XDP_TX_EMPTY_DS_COUNT;
-       session->pkt_count = 0;
-
-       mlx5e_xdp_update_inline_state(sq);
+       wqe = MLX5E_TX_FETCH_WQE(sq, pi);
+       net_prefetchw(wqe->data);
+
+       *session = (struct mlx5e_xdp_mpwqe) {
+               .wqe = wqe,
+               .ds_count = MLX5E_TX_WQE_EMPTY_DS_COUNT,
+               .pkt_count = 0,
+               .inline_on = mlx5e_xdp_get_inline_state(sq, session->inline_on),
+       };
 
        stats->mpwqe++;
 }
index 615bf04..96d6b15 100644 (file)
@@ -38,9 +38,7 @@
 #include "en/txrx.h"
 
 #define MLX5E_XDP_MIN_INLINE (ETH_HLEN + VLAN_HLEN)
-#define MLX5E_XDP_TX_EMPTY_DS_COUNT \
-       (sizeof(struct mlx5e_tx_wqe) / MLX5_SEND_WQE_DS)
-#define MLX5E_XDP_TX_DS_COUNT (MLX5E_XDP_TX_EMPTY_DS_COUNT + 1 /* SG DS */)
+#define MLX5E_XDP_TX_DS_COUNT (MLX5E_TX_WQE_EMPTY_DS_COUNT + 1 /* SG DS */)
 
 #define MLX5E_XDP_INLINE_WQE_MAX_DS_CNT 16
 #define MLX5E_XDP_INLINE_WQE_SZ_THRSD \
@@ -123,23 +121,20 @@ static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_xdpsq *sq)
 /* Enable inline WQEs to shift some load from a congested HCA (HW) to
  * a less congested cpu (SW).
  */
-static inline void mlx5e_xdp_update_inline_state(struct mlx5e_xdpsq *sq)
+static inline bool mlx5e_xdp_get_inline_state(struct mlx5e_xdpsq *sq, bool cur)
 {
        u16 outstanding = sq->xdpi_fifo_pc - sq->xdpi_fifo_cc;
-       struct mlx5e_xdp_mpwqe *session = &sq->mpwqe;
 
 #define MLX5E_XDP_INLINE_WATERMARK_LOW 10
 #define MLX5E_XDP_INLINE_WATERMARK_HIGH 128
 
-       if (session->inline_on) {
-               if (outstanding <= MLX5E_XDP_INLINE_WATERMARK_LOW)
-                       session->inline_on = 0;
-               return;
-       }
+       if (cur && outstanding <= MLX5E_XDP_INLINE_WATERMARK_LOW)
+               return false;
+
+       if (!cur && outstanding >= MLX5E_XDP_INLINE_WATERMARK_HIGH)
+               return true;
 
-       /* inline is false */
-       if (outstanding >= MLX5E_XDP_INLINE_WATERMARK_HIGH)
-               session->inline_on = 1;
+       return cur;
 }
 
 static inline bool mlx5e_xdp_mpqwe_is_full(struct mlx5e_xdp_mpwqe *session)
index 939bbf0..e458a0a 100644 (file)
@@ -305,7 +305,7 @@ static void mlx5e_sq_xmit_prepare(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 static void mlx5e_sq_calc_wqe_attr(struct sk_buff *skb, const struct mlx5e_tx_attr *attr,
                                   struct mlx5e_tx_wqe_attr *wqe_attr)
 {
-       u16 ds_cnt = sizeof(struct mlx5e_tx_wqe) / MLX5_SEND_WQE_DS;
+       u16 ds_cnt = MLX5E_TX_WQE_EMPTY_DS_COUNT;
        u16 ds_cnt_inl = 0;
 
        ds_cnt += !!attr->headlen + skb_shinfo(skb)->nr_frags;