net/mlx5e: Remove unnecessary fields in ICO SQ
authorTariq Toukan <tariqt@mellanox.com>
Mon, 17 Jul 2017 11:31:39 +0000 (14:31 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Sun, 3 Sep 2017 03:34:09 +0000 (06:34 +0300)
As of current design, in each NAPI, only a single UMR WQE
completion could be available in the completion queue of the
the internal control operations (ICO) send queue, in addition
to nop operations that require no actions upon completion.
This renders the consume index obsolete, as the wqe_counter
field in CQE is sufficient.

This helps removing a memory barrier, and obsoletes the need
for tracking the num_wqebbs to update the consumer counter.

In addition, remove other unused fields in icosq struct:
pdev, dma_fifo_pc, and prev_cc.

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

index 8d29a6eb94061ccdff99a884d84f38b854980fbe..e55d9439bc12b91c86cc7214f61136a55bc2aa56 100644 (file)
@@ -343,7 +343,6 @@ enum {
 
 struct mlx5e_sq_wqe_info {
        u8  opcode;
-       u8  num_wqebbs;
 };
 
 struct mlx5e_txqsq {
@@ -419,13 +418,8 @@ struct mlx5e_xdpsq {
 struct mlx5e_icosq {
        /* data path */
 
-       /* dirtied @completion */
-       u16                        cc;
-
        /* dirtied @xmit */
        u16                        pc ____cacheline_aligned_in_smp;
-       u32                        dma_fifo_pc;
-       u16                        prev_cc;
 
        struct mlx5e_cq            cq;
 
@@ -439,7 +433,6 @@ struct mlx5e_icosq {
        void __iomem              *uar_map;
        u32                        sqn;
        u16                        edge;
-       struct device             *pdev;
        __be32                     mkey_be;
        unsigned long              state;
 
index 162ba6ab749a69bd1f57cade122253b3d4d32944..a4c9a0a2c408991bf03f7d6f7c68551f741c4e36 100644 (file)
@@ -950,7 +950,6 @@ static void mlx5e_activate_rq(struct mlx5e_rq *rq)
 
        set_bit(MLX5E_RQ_STATE_ENABLED, &rq->state);
        sq->db.ico_wqe[pi].opcode     = MLX5_OPCODE_NOP;
-       sq->db.ico_wqe[pi].num_wqebbs = 1;
        nopwqe = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc);
        mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &nopwqe->ctrl);
 }
@@ -1052,7 +1051,6 @@ static int mlx5e_alloc_icosq(struct mlx5e_channel *c,
        struct mlx5_core_dev *mdev = c->mdev;
        int err;
 
-       sq->pdev      = c->pdev;
        sq->mkey_be   = c->mkey_be;
        sq->channel   = c;
        sq->uar_map   = mdev->mlx5e_res.bfreg.map;
index b236dfd71c182327ab83da26773b520d69b2b7bf..88a8749c67d64aa271a6802284179e716b72091b 100644 (file)
@@ -357,7 +357,6 @@ static inline void mlx5e_post_umr_wqe(struct mlx5e_rq *rq, u16 ix)
        /* fill sq edge with nops to avoid wqe wrap around */
        while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) {
                sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_NOP;
-               sq->db.ico_wqe[pi].num_wqebbs = 1;
                mlx5e_post_nop(wq, sq->sqn, &sq->pc);
        }
 
@@ -368,7 +367,6 @@ static inline void mlx5e_post_umr_wqe(struct mlx5e_rq *rq, u16 ix)
                            MLX5_OPCODE_UMR);
 
        sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_UMR;
-       sq->db.ico_wqe[pi].num_wqebbs = num_wqebbs;
        sq->pc += num_wqebbs;
        mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &wqe->ctrl);
 }
@@ -487,15 +485,13 @@ bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq)
 static inline void mlx5e_poll_ico_single_cqe(struct mlx5e_cq *cq,
                                             struct mlx5e_icosq *sq,
                                             struct mlx5e_rq *rq,
-                                            struct mlx5_cqe64 *cqe,
-                                            u16 *sqcc)
+                                            struct mlx5_cqe64 *cqe)
 {
        struct mlx5_wq_cyc *wq = &sq->wq;
        u16 ci = be16_to_cpu(cqe->wqe_counter) & wq->sz_m1;
        struct mlx5e_sq_wqe_info *icowi = &sq->db.ico_wqe[ci];
 
        mlx5_cqwq_pop(&cq->wq);
-       *sqcc += icowi->num_wqebbs;
 
        if (unlikely((cqe->op_own >> 4) != MLX5_CQE_REQ)) {
                WARN_ONCE(true, "mlx5e: Bad OP in ICOSQ CQE: 0x%x\n",
@@ -518,7 +514,6 @@ static void mlx5e_poll_ico_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
 {
        struct mlx5e_icosq *sq = container_of(cq, struct mlx5e_icosq, cq);
        struct mlx5_cqe64 *cqe;
-       u16 sqcc;
 
        if (unlikely(!MLX5E_TEST_BIT(sq->state, MLX5E_SQ_STATE_ENABLED)))
                return;
@@ -527,20 +522,10 @@ static void mlx5e_poll_ico_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
        if (likely(!cqe))
                return;
 
-       /* sq->cc must be updated only after mlx5_cqwq_update_db_record(),
-        * otherwise a cq overrun may occur
-        */
-       sqcc = sq->cc;
-
        /* by design, there's only a single cqe */
-       mlx5e_poll_ico_single_cqe(cq, sq, rq, cqe, &sqcc);
+       mlx5e_poll_ico_single_cqe(cq, sq, rq, cqe);
 
        mlx5_cqwq_update_db_record(&cq->wq);
-
-       /* ensure cq space is freed before enabling more cqes */
-       wmb();
-
-       sq->cc = sqcc;
 }
 
 bool mlx5e_post_rx_mpwqes(struct mlx5e_rq *rq)