net/mlx5e: Change skb fifo push/pop API to be used without SQ
authorEran Ben Elisha <eranbe@nvidia.com>
Tue, 1 Dec 2020 22:41:58 +0000 (14:41 -0800)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 8 Dec 2020 19:28:46 +0000 (11:28 -0800)
The skb fifo push/pop API used pre-defined attributes within the
mlx5e_txqsq.
In order to share the skb fifo API with other non-SQ use cases,
change the API input to get newly defined mlx5e_skb_fifo struct.

Signed-off-by: Eran Ben Elisha <eranbe@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c

index c014e8f..7f3bd3d 100644 (file)
@@ -331,6 +331,13 @@ struct mlx5e_tx_mpwqe {
        u8 inline_on;
 };
 
+struct mlx5e_skb_fifo {
+       struct sk_buff **fifo;
+       u16 *pc;
+       u16 *cc;
+       u16 mask;
+};
+
 struct mlx5e_txqsq {
        /* data path */
 
@@ -351,11 +358,10 @@ struct mlx5e_txqsq {
        /* read only */
        struct mlx5_wq_cyc         wq;
        u32                        dma_fifo_mask;
-       u16                        skb_fifo_mask;
        struct mlx5e_sq_stats     *stats;
        struct {
                struct mlx5e_sq_dma       *dma_fifo;
-               struct sk_buff           **skb_fifo;
+               struct mlx5e_skb_fifo      skb_fifo;
                struct mlx5e_tx_wqe_info  *wqe_info;
        } db;
        void __iomem              *uar_map;
index ac47efa..115ab19 100644 (file)
@@ -250,21 +250,24 @@ mlx5e_dma_push(struct mlx5e_txqsq *sq, dma_addr_t addr, u32 size,
        dma->type = map_type;
 }
 
-static inline struct sk_buff **mlx5e_skb_fifo_get(struct mlx5e_txqsq *sq, u16 i)
+static inline
+struct sk_buff **mlx5e_skb_fifo_get(struct mlx5e_skb_fifo *fifo, u16 i)
 {
-       return &sq->db.skb_fifo[i & sq->skb_fifo_mask];
+       return &fifo->fifo[i & fifo->mask];
 }
 
-static inline void mlx5e_skb_fifo_push(struct mlx5e_txqsq *sq, struct sk_buff *skb)
+static inline
+void mlx5e_skb_fifo_push(struct mlx5e_skb_fifo *fifo, struct sk_buff *skb)
 {
-       struct sk_buff **skb_item = mlx5e_skb_fifo_get(sq, sq->skb_fifo_pc++);
+       struct sk_buff **skb_item = mlx5e_skb_fifo_get(fifo, (*fifo->pc)++);
 
        *skb_item = skb;
 }
 
-static inline struct sk_buff *mlx5e_skb_fifo_pop(struct mlx5e_txqsq *sq)
+static inline
+struct sk_buff *mlx5e_skb_fifo_pop(struct mlx5e_skb_fifo *fifo)
 {
-       return *mlx5e_skb_fifo_get(sq, sq->skb_fifo_cc++);
+       return *mlx5e_skb_fifo_get(fifo, (*fifo->cc)++);
 }
 
 static inline void
index 1575011..f18787d 100644 (file)
@@ -1086,7 +1086,7 @@ static void mlx5e_free_icosq(struct mlx5e_icosq *sq)
 static void mlx5e_free_txqsq_db(struct mlx5e_txqsq *sq)
 {
        kvfree(sq->db.wqe_info);
-       kvfree(sq->db.skb_fifo);
+       kvfree(sq->db.skb_fifo.fifo);
        kvfree(sq->db.dma_fifo);
 }
 
@@ -1098,19 +1098,22 @@ static int mlx5e_alloc_txqsq_db(struct mlx5e_txqsq *sq, int numa)
        sq->db.dma_fifo = kvzalloc_node(array_size(df_sz,
                                                   sizeof(*sq->db.dma_fifo)),
                                        GFP_KERNEL, numa);
-       sq->db.skb_fifo = kvzalloc_node(array_size(df_sz,
-                                                  sizeof(*sq->db.skb_fifo)),
+       sq->db.skb_fifo.fifo = kvzalloc_node(array_size(df_sz,
+                                                       sizeof(*sq->db.skb_fifo.fifo)),
                                        GFP_KERNEL, numa);
        sq->db.wqe_info = kvzalloc_node(array_size(wq_sz,
                                                   sizeof(*sq->db.wqe_info)),
                                        GFP_KERNEL, numa);
-       if (!sq->db.dma_fifo || !sq->db.skb_fifo || !sq->db.wqe_info) {
+       if (!sq->db.dma_fifo || !sq->db.skb_fifo.fifo || !sq->db.wqe_info) {
                mlx5e_free_txqsq_db(sq);
                return -ENOMEM;
        }
 
        sq->dma_fifo_mask = df_sz - 1;
-       sq->skb_fifo_mask = df_sz - 1;
+
+       sq->db.skb_fifo.pc   = &sq->skb_fifo_pc;
+       sq->db.skb_fifo.cc   = &sq->skb_fifo_cc;
+       sq->db.skb_fifo.mask = df_sz - 1;
 
        return 0;
 }
index 76496c9..149d26a 100644 (file)
@@ -579,7 +579,7 @@ mlx5e_sq_xmit_mpwqe(struct mlx5e_txqsq *sq, struct sk_buff *skb,
                goto err_unmap;
        mlx5e_dma_push(sq, txd.dma_addr, txd.len, MLX5E_DMA_MAP_SINGLE);
 
-       mlx5e_skb_fifo_push(sq, skb);
+       mlx5e_skb_fifo_push(&sq->db.skb_fifo, skb);
 
        mlx5e_tx_mpwqe_add_dseg(sq, &txd);
 
@@ -719,7 +719,7 @@ static void mlx5e_tx_wi_consume_fifo_skbs(struct mlx5e_txqsq *sq, struct mlx5e_t
        int i;
 
        for (i = 0; i < wi->num_fifo_pkts; i++) {
-               struct sk_buff *skb = mlx5e_skb_fifo_pop(sq);
+               struct sk_buff *skb = mlx5e_skb_fifo_pop(&sq->db.skb_fifo);
 
                mlx5e_consume_skb(sq, skb, cqe, napi_budget);
        }
@@ -839,7 +839,7 @@ static void mlx5e_tx_wi_kfree_fifo_skbs(struct mlx5e_txqsq *sq, struct mlx5e_tx_
        int i;
 
        for (i = 0; i < wi->num_fifo_pkts; i++)
-               dev_kfree_skb_any(mlx5e_skb_fifo_pop(sq));
+               dev_kfree_skb_any(mlx5e_skb_fifo_pop(&sq->db.skb_fifo));
 }
 
 void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq)