net/mlx5e: Use WQ API functions instead of direct fields access
authorTariq Toukan <tariqt@mellanox.com>
Wed, 2 May 2018 15:30:56 +0000 (18:30 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 25 May 2018 21:11:00 +0000 (14:11 -0700)
Use the WQ API to get the WQ size, and to map a counter
into a WQ entry index.

Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
drivers/net/ethernet/mellanox/mlx5/core/wq.h

index c5c7a6d..061c4e9 100644 (file)
@@ -450,7 +450,7 @@ struct mlx5e_icosq {
 static inline bool
 mlx5e_wqc_has_room_for(struct mlx5_wq_cyc *wq, u16 cc, u16 pc, u16 n)
 {
-       return (((wq->sz_m1 & (cc - pc)) >= n) || (cc == pc));
+       return (mlx5_wq_cyc_ctr2ix(wq, cc - pc) >= n) || (cc == pc);
 }
 
 struct mlx5e_dma_info {
@@ -956,10 +956,9 @@ static inline void mlx5e_sq_fetch_wqe(struct mlx5e_txqsq *sq,
                                      struct mlx5e_tx_wqe **wqe,
                                      u16 *pi)
 {
-       struct mlx5_wq_cyc *wq;
+       struct mlx5_wq_cyc *wq = &sq->wq;
 
-       wq = &sq->wq;
-       *pi = sq->pc & wq->sz_m1;
+       *pi  = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
        *wqe = mlx5_wq_cyc_get_wqe(wq, *pi);
        memset(*wqe, 0, sizeof(**wqe));
 }
@@ -967,7 +966,7 @@ static inline void mlx5e_sq_fetch_wqe(struct mlx5e_txqsq *sq,
 static inline
 struct mlx5e_tx_wqe *mlx5e_post_nop(struct mlx5_wq_cyc *wq, u32 sqn, u16 *pc)
 {
-       u16                         pi   = *pc & wq->sz_m1;
+       u16                         pi   = mlx5_wq_cyc_ctr2ix(wq, *pc);
        struct mlx5e_tx_wqe        *wqe  = mlx5_wq_cyc_get_wqe(wq, pi);
        struct mlx5_wqe_ctrl_seg   *cseg = &wqe->ctrl;
 
index cee44c2..41f57af 100644 (file)
@@ -836,13 +836,15 @@ err_free_rq:
 static void mlx5e_activate_rq(struct mlx5e_rq *rq)
 {
        struct mlx5e_icosq *sq = &rq->channel->icosq;
-       u16 pi = sq->pc & sq->wq.sz_m1;
+       struct mlx5_wq_cyc *wq = &sq->wq;
        struct mlx5e_tx_wqe *nopwqe;
 
+       u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
+
        set_bit(MLX5E_RQ_STATE_ENABLED, &rq->state);
        sq->db.ico_wqe[pi].opcode     = MLX5_OPCODE_NOP;
-       nopwqe = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc);
-       mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &nopwqe->ctrl);
+       nopwqe = mlx5e_post_nop(wq, sq->sqn, &sq->pc);
+       mlx5e_notify_hw(wq, sq->pc, sq->uar_map, &nopwqe->ctrl);
 }
 
 static void mlx5e_deactivate_rq(struct mlx5e_rq *rq)
@@ -885,6 +887,7 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
 {
        void *sqc_wq               = MLX5_ADDR_OF(sqc, param->sqc, wq);
        struct mlx5_core_dev *mdev = c->mdev;
+       struct mlx5_wq_cyc *wq = &sq->wq;
        int err;
 
        sq->pdev      = c->pdev;
@@ -894,10 +897,10 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
        sq->min_inline_mode = params->tx_min_inline_mode;
 
        param->wq.db_numa_node = cpu_to_node(c->cpu);
-       err = mlx5_wq_cyc_create(mdev, &param->wq, sqc_wq, &sq->wq, &sq->wq_ctrl);
+       err = mlx5_wq_cyc_create(mdev, &param->wq, sqc_wq, wq, &sq->wq_ctrl);
        if (err)
                return err;
-       sq->wq.db = &sq->wq.db[MLX5_SND_DBR];
+       wq->db = &wq->db[MLX5_SND_DBR];
 
        err = mlx5e_alloc_xdpsq_db(sq, cpu_to_node(c->cpu));
        if (err)
@@ -940,22 +943,23 @@ static int mlx5e_alloc_icosq(struct mlx5e_channel *c,
 {
        void *sqc_wq               = MLX5_ADDR_OF(sqc, param->sqc, wq);
        struct mlx5_core_dev *mdev = c->mdev;
+       struct mlx5_wq_cyc *wq = &sq->wq;
        int err;
 
        sq->channel   = c;
        sq->uar_map   = mdev->mlx5e_res.bfreg.map;
 
        param->wq.db_numa_node = cpu_to_node(c->cpu);
-       err = mlx5_wq_cyc_create(mdev, &param->wq, sqc_wq, &sq->wq, &sq->wq_ctrl);
+       err = mlx5_wq_cyc_create(mdev, &param->wq, sqc_wq, wq, &sq->wq_ctrl);
        if (err)
                return err;
-       sq->wq.db = &sq->wq.db[MLX5_SND_DBR];
+       wq->db = &wq->db[MLX5_SND_DBR];
 
        err = mlx5e_alloc_icosq_db(sq, cpu_to_node(c->cpu));
        if (err)
                goto err_sq_wq_destroy;
 
-       sq->edge = (sq->wq.sz_m1 + 1) - MLX5E_ICOSQ_MAX_WQEBBS;
+       sq->edge = mlx5_wq_cyc_get_size(wq) - MLX5E_ICOSQ_MAX_WQEBBS;
 
        return 0;
 
@@ -1005,6 +1009,7 @@ static int mlx5e_alloc_txqsq(struct mlx5e_channel *c,
 {
        void *sqc_wq               = MLX5_ADDR_OF(sqc, param->sqc, wq);
        struct mlx5_core_dev *mdev = c->mdev;
+       struct mlx5_wq_cyc *wq = &sq->wq;
        int err;
 
        sq->pdev      = c->pdev;
@@ -1022,10 +1027,10 @@ static int mlx5e_alloc_txqsq(struct mlx5e_channel *c,
                set_bit(MLX5E_SQ_STATE_TLS, &sq->state);
 
        param->wq.db_numa_node = cpu_to_node(c->cpu);
-       err = mlx5_wq_cyc_create(mdev, &param->wq, sqc_wq, &sq->wq, &sq->wq_ctrl);
+       err = mlx5_wq_cyc_create(mdev, &param->wq, sqc_wq, wq, &sq->wq_ctrl);
        if (err)
                return err;
-       sq->wq.db    = &sq->wq.db[MLX5_SND_DBR];
+       wq->db    = &wq->db[MLX5_SND_DBR];
 
        err = mlx5e_alloc_txqsq_db(sq, cpu_to_node(c->cpu));
        if (err)
@@ -1034,7 +1039,7 @@ static int mlx5e_alloc_txqsq(struct mlx5e_channel *c,
        INIT_WORK(&sq->dim.work, mlx5e_tx_dim_work);
        sq->dim.mode = params->tx_cq_moderation.cq_period_mode;
 
-       sq->edge = (sq->wq.sz_m1 + 1) - MLX5_SEND_WQE_MAX_WQEBBS;
+       sq->edge = mlx5_wq_cyc_get_size(wq) - MLX5_SEND_WQE_MAX_WQEBBS;
 
        return 0;
 
@@ -1238,6 +1243,7 @@ static inline void netif_tx_disable_queue(struct netdev_queue *txq)
 static void mlx5e_deactivate_txqsq(struct mlx5e_txqsq *sq)
 {
        struct mlx5e_channel *c = sq->channel;
+       struct mlx5_wq_cyc *wq = &sq->wq;
 
        clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
        /* prevent netif_tx_wake_queue */
@@ -1246,12 +1252,13 @@ static void mlx5e_deactivate_txqsq(struct mlx5e_txqsq *sq)
        netif_tx_disable_queue(sq->txq);
 
        /* last doorbell out, godspeed .. */
-       if (mlx5e_wqc_has_room_for(&sq->wq, sq->cc, sq->pc, 1)) {
+       if (mlx5e_wqc_has_room_for(wq, sq->cc, sq->pc, 1)) {
+               u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
                struct mlx5e_tx_wqe *nop;
 
-               sq->db.wqe_info[(sq->pc & sq->wq.sz_m1)].skb = NULL;
-               nop = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc);
-               mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &nop->ctrl);
+               sq->db.wqe_info[pi].skb = NULL;
+               nop = mlx5e_post_nop(wq, sq->sqn, &sq->pc);
+               mlx5e_notify_hw(wq, sq->pc, sq->uar_map, &nop->ctrl);
        }
 }
 
index 53f7292..7fd3ec8 100644 (file)
@@ -54,7 +54,7 @@ static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
 static inline void mlx5e_read_cqe_slot(struct mlx5e_cq *cq, u32 cqcc,
                                       void *data)
 {
-       u32 ci = cqcc & cq->wq.fbc.sz_m1;
+       u32 ci = mlx5_cqwq_ctr2ix(&cq->wq, cqcc);
 
        memcpy(data, mlx5_cqwq_get_wqe(&cq->wq, ci), sizeof(struct mlx5_cqe64));
 }
@@ -76,10 +76,11 @@ static inline void mlx5e_read_mini_arr_slot(struct mlx5e_cq *cq, u32 cqcc)
 
 static inline void mlx5e_cqes_update_owner(struct mlx5e_cq *cq, u32 cqcc, int n)
 {
-       struct mlx5_frag_buf_ctrl *fbc = &cq->wq.fbc;
-       u8 op_own = (cqcc >> fbc->log_sz) & 1;
-       u32 wq_sz = 1 << fbc->log_sz;
-       u32 ci = cqcc & fbc->sz_m1;
+       struct mlx5_cqwq *wq = &cq->wq;
+
+       u8  op_own = mlx5_cqwq_get_ctr_wrap_cnt(wq, cqcc) & 1;
+       u32 ci     = mlx5_cqwq_ctr2ix(wq, cqcc);
+       u32 wq_sz  = mlx5_cqwq_get_size(wq);
        u32 ci_top = min_t(u32, wq_sz, ci + n);
 
        for (; ci < ci_top; ci++, n--) {
@@ -112,7 +113,7 @@ static inline void mlx5e_decompress_cqe(struct mlx5e_rq *rq,
                        mpwrq_get_cqe_consumed_strides(&cq->title);
        else
                cq->decmprs_wqe_counter =
-                       (cq->decmprs_wqe_counter + 1) & rq->wq.sz_m1;
+                       mlx5_wq_ll_ctr2ix(&rq->wq, cq->decmprs_wqe_counter + 1);
 }
 
 static inline void mlx5e_decompress_cqe_no_hash(struct mlx5e_rq *rq,
@@ -395,7 +396,7 @@ static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
        int i;
 
        /* fill sq edge with nops to avoid wqe wrap around */
-       while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) {
+       while ((pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc)) > sq->edge) {
                sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_NOP;
                mlx5e_post_nop(wq, sq->sqn, &sq->pc);
        }
@@ -482,7 +483,7 @@ static inline void mlx5e_poll_ico_single_cqe(struct mlx5e_cq *cq,
                                             struct mlx5_cqe64 *cqe)
 {
        struct mlx5_wq_cyc *wq = &sq->wq;
-       u16 ci = be16_to_cpu(cqe->wqe_counter) & wq->sz_m1;
+       u16 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter));
        struct mlx5e_sq_wqe_info *icowi = &sq->db.ico_wqe[ci];
 
        mlx5_cqwq_pop(&cq->wq);
@@ -731,7 +732,7 @@ static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_xdpsq *sq)
 {
        struct mlx5_wq_cyc *wq = &sq->wq;
        struct mlx5e_tx_wqe *wqe;
-       u16 pi = (sq->pc - 1) & wq->sz_m1; /* last pi */
+       u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc - 1); /* last pi */
 
        wqe  = mlx5_wq_cyc_get_wqe(wq, pi);
 
@@ -744,7 +745,7 @@ static inline bool mlx5e_xmit_xdp_frame(struct mlx5e_rq *rq,
 {
        struct mlx5e_xdpsq       *sq   = &rq->xdpsq;
        struct mlx5_wq_cyc       *wq   = &sq->wq;
-       u16                       pi   = sq->pc & wq->sz_m1;
+       u16                       pi   = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
        struct mlx5e_tx_wqe      *wqe  = mlx5_wq_cyc_get_wqe(wq, pi);
 
        struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
@@ -1214,7 +1215,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
 
                        last_wqe = (sqcc == wqe_counter);
 
-                       ci = sqcc & sq->wq.sz_m1;
+                       ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
                        di = &sq->db.di[ci];
 
                        sqcc++;
@@ -1239,7 +1240,7 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq)
        u16 ci;
 
        while (sq->cc != sq->pc) {
-               ci = sq->cc & sq->wq.sz_m1;
+               ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
                di = &sq->db.di[ci];
                sq->cc++;
 
index 2d3f17d..c9864fc 100644 (file)
@@ -331,7 +331,7 @@ mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,
                mlx5e_notify_hw(wq, sq->pc, sq->uar_map, cseg);
 
        /* fill sq edge with nops to avoid wqe wrap around */
-       while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) {
+       while ((pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc)) > sq->edge) {
                sq->db.wqe_info[pi].skb = NULL;
                mlx5e_post_nop(wq, sq->sqn, &sq->pc);
                sq->stats.nop++;
@@ -496,7 +496,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)
 
                        last_wqe = (sqcc == wqe_counter);
 
-                       ci = sqcc & sq->wq.sz_m1;
+                       ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
                        wi = &sq->db.wqe_info[ci];
                        skb = wi->skb;
 
@@ -559,7 +559,7 @@ void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq)
        int i;
 
        while (sq->cc != sq->pc) {
-               ci = sq->cc & sq->wq.sz_m1;
+               ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
                wi = &sq->db.wqe_info[ci];
                skb = wi->skb;
 
@@ -606,7 +606,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
                          struct mlx5_av *av, u32 dqpn, u32 dqkey)
 {
        struct mlx5_wq_cyc       *wq   = &sq->wq;
-       u16                       pi   = sq->pc & wq->sz_m1;
+       u16                       pi   = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
        struct mlx5i_tx_wqe      *wqe  = mlx5_wq_cyc_get_wqe(wq, pi);
        struct mlx5e_tx_wqe_info *wi   = &sq->db.wqe_info[pi];
 
index f3dfa0c..a3572e1 100644 (file)
@@ -123,9 +123,14 @@ static inline int mlx5_wq_cyc_cc_bigger(u16 cc1, u16 cc2)
        return !equal && !smaller;
 }
 
+static inline u32 mlx5_cqwq_ctr2ix(struct mlx5_cqwq *wq, u32 ctr)
+{
+       return ctr & wq->fbc.sz_m1;
+}
+
 static inline u32 mlx5_cqwq_get_ci(struct mlx5_cqwq *wq)
 {
-       return wq->cc & wq->fbc.sz_m1;
+       return mlx5_cqwq_ctr2ix(wq, wq->cc);
 }
 
 static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix)
@@ -133,9 +138,14 @@ static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix)
        return mlx5_frag_buf_get_wqe(&wq->fbc, ix);
 }
 
+static inline u32 mlx5_cqwq_get_ctr_wrap_cnt(struct mlx5_cqwq *wq, u32 ctr)
+{
+       return ctr >> wq->fbc.log_sz;
+}
+
 static inline u32 mlx5_cqwq_get_wrap_cnt(struct mlx5_cqwq *wq)
 {
-       return wq->cc >> wq->fbc.log_sz;
+       return mlx5_cqwq_get_ctr_wrap_cnt(wq, wq->cc);
 }
 
 static inline void mlx5_cqwq_pop(struct mlx5_cqwq *wq)
@@ -174,6 +184,11 @@ static inline int mlx5_wq_ll_is_empty(struct mlx5_wq_ll *wq)
        return !wq->cur_sz;
 }
 
+static inline u16 mlx5_wq_ll_ctr2ix(struct mlx5_wq_ll *wq, u16 ctr)
+{
+       return ctr & wq->sz_m1;
+}
+
 static inline void *mlx5_wq_ll_get_wqe(struct mlx5_wq_ll *wq, u16 ix)
 {
        return wq->buf + (ix << wq->log_stride);