Skip to content

Commit 1feeab8

Browse files
Tariq ToukanSaeed Mahameed
authored andcommitted
net/mlx5e: XDP, Add array for WQE info descriptors
Each xdp_wqe_info instance describes the number of data-segments and WQEBBs of the WQE. This is useful for a downstream patch that adds support for Multi-Packet TX WQE feature. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
1 parent fea28dd commit 1feeab8

File tree

3 files changed

+54
-21
lines changed

3 files changed

+54
-21
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,11 @@ struct mlx5e_xdp_info_fifo {
411411
u32 mask;
412412
};
413413

414+
struct mlx5e_xdp_wqe_info {
415+
u8 num_wqebbs;
416+
u8 num_ds;
417+
};
418+
414419
struct mlx5e_xdpsq {
415420
/* data path */
416421

@@ -430,6 +435,7 @@ struct mlx5e_xdpsq {
430435
struct mlx5_wq_cyc wq;
431436
struct mlx5e_xdpsq_stats *stats;
432437
struct {
438+
struct mlx5e_xdp_wqe_info *wqe_info;
433439
struct mlx5e_xdp_info_fifo xdpi_fifo;
434440
} db;
435441
void __iomem *uar_map;

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

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -199,19 +199,27 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
199199
get_cqe_opcode(cqe));
200200

201201
do {
202-
struct mlx5e_xdp_info xdpi =
203-
mlx5e_xdpi_fifo_pop(xdpi_fifo);
202+
struct mlx5e_xdp_wqe_info *wi;
203+
u16 ci, j;
204204

205205
last_wqe = (sqcc == wqe_counter);
206-
sqcc++;
207-
208-
if (is_redirect) {
209-
xdp_return_frame(xdpi.xdpf);
210-
dma_unmap_single(sq->pdev, xdpi.dma_addr,
211-
xdpi.xdpf->len, DMA_TO_DEVICE);
212-
} else {
213-
/* Recycle RX page */
214-
mlx5e_page_release(rq, &xdpi.di, true);
206+
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
207+
wi = &sq->db.wqe_info[ci];
208+
209+
sqcc += wi->num_wqebbs;
210+
211+
for (j = 0; j < wi->num_ds; j++) {
212+
struct mlx5e_xdp_info xdpi =
213+
mlx5e_xdpi_fifo_pop(xdpi_fifo);
214+
215+
if (is_redirect) {
216+
xdp_return_frame(xdpi.xdpf);
217+
dma_unmap_single(sq->pdev, xdpi.dma_addr,
218+
xdpi.xdpf->len, DMA_TO_DEVICE);
219+
} else {
220+
/* Recycle RX page */
221+
mlx5e_page_release(rq, &xdpi.di, true);
222+
}
215223
}
216224
} while (!last_wqe);
217225
} while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
@@ -233,18 +241,26 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq, struct mlx5e_rq *rq)
233241
bool is_redirect = !rq;
234242

235243
while (sq->cc != sq->pc) {
236-
struct mlx5e_xdp_info xdpi =
237-
mlx5e_xdpi_fifo_pop(xdpi_fifo);
244+
struct mlx5e_xdp_wqe_info *wi;
245+
u16 ci, i;
238246

239-
sq->cc++;
247+
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
248+
wi = &sq->db.wqe_info[ci];
240249

241-
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);
245-
} else {
246-
/* Recycle RX page */
247-
mlx5e_page_release(rq, &xdpi.di, false);
250+
sq->cc += wi->num_wqebbs;
251+
252+
for (i = 0; i < wi->num_ds; i++) {
253+
struct mlx5e_xdp_info xdpi =
254+
mlx5e_xdpi_fifo_pop(xdpi_fifo);
255+
256+
if (is_redirect) {
257+
xdp_return_frame(xdpi.xdpf);
258+
dma_unmap_single(sq->pdev, xdpi.dma_addr,
259+
xdpi.xdpf->len, DMA_TO_DEVICE);
260+
} else {
261+
/* Recycle RX page */
262+
mlx5e_page_release(rq, &xdpi.di, false);
263+
}
248264
}
249265
}
250266
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,7 @@ static void mlx5e_close_rq(struct mlx5e_rq *rq)
993993
static void mlx5e_free_xdpsq_db(struct mlx5e_xdpsq *sq)
994994
{
995995
kvfree(sq->db.xdpi_fifo.xi);
996+
kvfree(sq->db.wqe_info);
996997
}
997998

998999
static int mlx5e_alloc_xdpsq_fifo(struct mlx5e_xdpsq *sq, int numa)
@@ -1015,8 +1016,14 @@ static int mlx5e_alloc_xdpsq_fifo(struct mlx5e_xdpsq *sq, int numa)
10151016

10161017
static int mlx5e_alloc_xdpsq_db(struct mlx5e_xdpsq *sq, int numa)
10171018
{
1019+
int wq_sz = mlx5_wq_cyc_get_size(&sq->wq);
10181020
int err;
10191021

1022+
sq->db.wqe_info = kvzalloc_node(sizeof(*sq->db.wqe_info) * wq_sz,
1023+
GFP_KERNEL, numa);
1024+
if (!sq->db.wqe_info)
1025+
return -ENOMEM;
1026+
10201027
err = mlx5e_alloc_xdpsq_fifo(sq, numa);
10211028
if (err) {
10221029
mlx5e_free_xdpsq_db(sq);
@@ -1606,6 +1613,7 @@ static int mlx5e_open_xdpsq(struct mlx5e_channel *c,
16061613

16071614
/* Pre initialize fixed WQE fields */
16081615
for (i = 0; i < mlx5_wq_cyc_get_size(&sq->wq); i++) {
1616+
struct mlx5e_xdp_wqe_info *wi = &sq->db.wqe_info[i];
16091617
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(&sq->wq, i);
16101618
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
16111619
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
@@ -1616,6 +1624,9 @@ static int mlx5e_open_xdpsq(struct mlx5e_channel *c,
16161624

16171625
dseg = (struct mlx5_wqe_data_seg *)cseg + (ds_cnt - 1);
16181626
dseg->lkey = sq->mkey_be;
1627+
1628+
wi->num_wqebbs = 1;
1629+
wi->num_ds = 1;
16191630
}
16201631

16211632
return 0;

0 commit comments

Comments
 (0)