Skip to content

Commit fea28dd

Browse files
Tariq ToukanSaeed Mahameed
authored andcommitted
net/mlx5e: XDP, Maintain a FIFO structure for xdp_info instances
This provides infrastructure to have multiple xdp_info instances for the same consumer index. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
1 parent b818039 commit fea28dd

File tree

4 files changed

+65
-24
lines changed

4 files changed

+65
-24
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,15 +404,24 @@ struct mlx5e_xdp_info {
404404
struct mlx5e_dma_info di;
405405
};
406406

407+
struct mlx5e_xdp_info_fifo {
408+
struct mlx5e_xdp_info *xi;
409+
u32 *cc;
410+
u32 *pc;
411+
u32 mask;
412+
};
413+
407414
struct mlx5e_xdpsq {
408415
/* data path */
409416

410417
/* dirtied @completion */
418+
u32 xdpi_fifo_cc;
411419
u16 cc;
412420
bool redirect_flush;
413421

414422
/* dirtied @xmit */
415-
u16 pc ____cacheline_aligned_in_smp;
423+
u32 xdpi_fifo_pc ____cacheline_aligned_in_smp;
424+
u16 pc;
416425
struct mlx5_wqe_ctrl_seg *doorbell_cseg;
417426

418427
struct mlx5e_cq cq;
@@ -421,7 +430,7 @@ struct mlx5e_xdpsq {
421430
struct mlx5_wq_cyc wq;
422431
struct mlx5e_xdpsq_stats *stats;
423432
struct {
424-
struct mlx5e_xdp_info *xdpi;
433+
struct mlx5e_xdp_info_fifo xdpi_fifo;
425434
} db;
426435
void __iomem *uar_map;
427436
u32 sqn;

drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -149,20 +149,18 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi)
149149

150150
cseg->opmod_idx_opcode = cpu_to_be32((sq->pc << 8) | MLX5_OPCODE_SEND);
151151

152-
/* move page to reference to sq responsibility,
153-
* and mark so it's not put back in page-cache.
154-
*/
155-
sq->db.xdpi[pi] = *xdpi;
156152
sq->pc++;
157153

158154
sq->doorbell_cseg = cseg;
159155

156+
mlx5e_xdpi_fifo_push(&sq->db.xdpi_fifo, xdpi);
160157
stats->xmit++;
161158
return true;
162159
}
163160

164161
bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
165162
{
163+
struct mlx5e_xdp_info_fifo *xdpi_fifo;
166164
struct mlx5e_xdpsq *sq;
167165
struct mlx5_cqe64 *cqe;
168166
bool is_redirect;
@@ -179,6 +177,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
179177
return false;
180178

181179
is_redirect = !rq;
180+
xdpi_fifo = &sq->db.xdpi_fifo;
182181

183182
/* sq->cc must be updated only after mlx5_cqwq_update_db_record(),
184183
* otherwise a cq overrun may occur
@@ -200,19 +199,19 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
200199
get_cqe_opcode(cqe));
201200

202201
do {
203-
u16 ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
204-
struct mlx5e_xdp_info *xdpi = &sq->db.xdpi[ci];
202+
struct mlx5e_xdp_info xdpi =
203+
mlx5e_xdpi_fifo_pop(xdpi_fifo);
205204

206205
last_wqe = (sqcc == wqe_counter);
207206
sqcc++;
208207

209208
if (is_redirect) {
210-
xdp_return_frame(xdpi->xdpf);
211-
dma_unmap_single(sq->pdev, xdpi->dma_addr,
212-
xdpi->xdpf->len, DMA_TO_DEVICE);
209+
xdp_return_frame(xdpi.xdpf);
210+
dma_unmap_single(sq->pdev, xdpi.dma_addr,
211+
xdpi.xdpf->len, DMA_TO_DEVICE);
213212
} else {
214213
/* Recycle RX page */
215-
mlx5e_page_release(rq, &xdpi->di, true);
214+
mlx5e_page_release(rq, &xdpi.di, true);
216215
}
217216
} while (!last_wqe);
218217
} while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
@@ -230,21 +229,22 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
230229

231230
void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq, struct mlx5e_rq *rq)
232231
{
232+
struct mlx5e_xdp_info_fifo *xdpi_fifo = &sq->db.xdpi_fifo;
233233
bool is_redirect = !rq;
234234

235235
while (sq->cc != sq->pc) {
236-
u16 ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
237-
struct mlx5e_xdp_info *xdpi = &sq->db.xdpi[ci];
236+
struct mlx5e_xdp_info xdpi =
237+
mlx5e_xdpi_fifo_pop(xdpi_fifo);
238238

239239
sq->cc++;
240240

241241
if (is_redirect) {
242-
xdp_return_frame(xdpi->xdpf);
243-
dma_unmap_single(sq->pdev, xdpi->dma_addr,
244-
xdpi->xdpf->len, DMA_TO_DEVICE);
242+
xdp_return_frame(xdpi.xdpf);
243+
dma_unmap_single(sq->pdev, xdpi.dma_addr,
244+
xdpi.xdpf->len, DMA_TO_DEVICE);
245245
} else {
246246
/* Recycle RX page */
247-
mlx5e_page_release(rq, &xdpi->di, false);
247+
mlx5e_page_release(rq, &xdpi.di, false);
248248
}
249249
}
250250
}

drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,19 @@ static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_xdpsq *sq)
5757
}
5858
}
5959

60+
static inline void
61+
mlx5e_xdpi_fifo_push(struct mlx5e_xdp_info_fifo *fifo,
62+
struct mlx5e_xdp_info *xi)
63+
{
64+
u32 i = (*fifo->pc)++ & fifo->mask;
65+
66+
fifo->xi[i] = *xi;
67+
}
68+
69+
static inline struct mlx5e_xdp_info
70+
mlx5e_xdpi_fifo_pop(struct mlx5e_xdp_info_fifo *fifo)
71+
{
72+
return fifo->xi[(*fifo->cc)++ & fifo->mask];
73+
}
74+
6075
#endif

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -992,18 +992,35 @@ static void mlx5e_close_rq(struct mlx5e_rq *rq)
992992

993993
static void mlx5e_free_xdpsq_db(struct mlx5e_xdpsq *sq)
994994
{
995-
kvfree(sq->db.xdpi);
995+
kvfree(sq->db.xdpi_fifo.xi);
996+
}
997+
998+
static int mlx5e_alloc_xdpsq_fifo(struct mlx5e_xdpsq *sq, int numa)
999+
{
1000+
struct mlx5e_xdp_info_fifo *xdpi_fifo = &sq->db.xdpi_fifo;
1001+
int wq_sz = mlx5_wq_cyc_get_size(&sq->wq);
1002+
int dsegs_per_wq = wq_sz * MLX5_SEND_WQEBB_NUM_DS;
1003+
1004+
xdpi_fifo->xi = kvzalloc_node(sizeof(*xdpi_fifo->xi) * dsegs_per_wq,
1005+
GFP_KERNEL, numa);
1006+
if (!xdpi_fifo->xi)
1007+
return -ENOMEM;
1008+
1009+
xdpi_fifo->pc = &sq->xdpi_fifo_pc;
1010+
xdpi_fifo->cc = &sq->xdpi_fifo_cc;
1011+
xdpi_fifo->mask = dsegs_per_wq - 1;
1012+
1013+
return 0;
9961014
}
9971015

9981016
static int mlx5e_alloc_xdpsq_db(struct mlx5e_xdpsq *sq, int numa)
9991017
{
1000-
int wq_sz = mlx5_wq_cyc_get_size(&sq->wq);
1018+
int err;
10011019

1002-
sq->db.xdpi = kvzalloc_node(array_size(wq_sz, sizeof(*sq->db.xdpi)),
1003-
GFP_KERNEL, numa);
1004-
if (!sq->db.xdpi) {
1020+
err = mlx5e_alloc_xdpsq_fifo(sq, numa);
1021+
if (err) {
10051022
mlx5e_free_xdpsq_db(sq);
1006-
return -ENOMEM;
1023+
return err;
10071024
}
10081025

10091026
return 0;

0 commit comments

Comments
 (0)