@@ -366,7 +366,8 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
366
366
static void mlx5e_free_xdpsq_desc (struct mlx5e_xdpsq * sq ,
367
367
struct mlx5e_xdp_wqe_info * wi ,
368
368
u32 * xsk_frames ,
369
- bool recycle )
369
+ bool recycle ,
370
+ struct xdp_frame_bulk * bq )
370
371
{
371
372
struct mlx5e_xdp_info_fifo * xdpi_fifo = & sq -> db .xdpi_fifo ;
372
373
u16 i ;
@@ -379,7 +380,7 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
379
380
/* XDP_TX from the XSK RQ and XDP_REDIRECT */
380
381
dma_unmap_single (sq -> pdev , xdpi .frame .dma_addr ,
381
382
xdpi .frame .xdpf -> len , DMA_TO_DEVICE );
382
- xdp_return_frame (xdpi .frame .xdpf );
383
+ xdp_return_frame_bulk (xdpi .frame .xdpf , bq );
383
384
break ;
384
385
case MLX5E_XDP_XMIT_MODE_PAGE :
385
386
/* XDP_TX from the regular RQ */
@@ -397,12 +398,15 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
397
398
398
399
bool mlx5e_poll_xdpsq_cq (struct mlx5e_cq * cq )
399
400
{
401
+ struct xdp_frame_bulk bq ;
400
402
struct mlx5e_xdpsq * sq ;
401
403
struct mlx5_cqe64 * cqe ;
402
404
u32 xsk_frames = 0 ;
403
405
u16 sqcc ;
404
406
int i ;
405
407
408
+ xdp_frame_bulk_init (& bq );
409
+
406
410
sq = container_of (cq , struct mlx5e_xdpsq , cq );
407
411
408
412
if (unlikely (!test_bit (MLX5E_SQ_STATE_ENABLED , & sq -> state )))
@@ -434,7 +438,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
434
438
435
439
sqcc += wi -> num_wqebbs ;
436
440
437
- mlx5e_free_xdpsq_desc (sq , wi , & xsk_frames , true);
441
+ mlx5e_free_xdpsq_desc (sq , wi , & xsk_frames , true, & bq );
438
442
} while (!last_wqe );
439
443
440
444
if (unlikely (get_cqe_opcode (cqe ) != MLX5_CQE_REQ )) {
@@ -447,6 +451,8 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
447
451
}
448
452
} while ((++ i < MLX5E_TX_CQ_POLL_BUDGET ) && (cqe = mlx5_cqwq_get_cqe (& cq -> wq )));
449
453
454
+ xdp_flush_frame_bulk (& bq );
455
+
450
456
if (xsk_frames )
451
457
xsk_tx_completed (sq -> xsk_pool , xsk_frames );
452
458
@@ -463,8 +469,13 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
463
469
464
470
void mlx5e_free_xdpsq_descs (struct mlx5e_xdpsq * sq )
465
471
{
472
+ struct xdp_frame_bulk bq ;
466
473
u32 xsk_frames = 0 ;
467
474
475
+ xdp_frame_bulk_init (& bq );
476
+
477
+ rcu_read_lock (); /* need for xdp_return_frame_bulk */
478
+
468
479
while (sq -> cc != sq -> pc ) {
469
480
struct mlx5e_xdp_wqe_info * wi ;
470
481
u16 ci ;
@@ -474,9 +485,12 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq)
474
485
475
486
sq -> cc += wi -> num_wqebbs ;
476
487
477
- mlx5e_free_xdpsq_desc (sq , wi , & xsk_frames , false);
488
+ mlx5e_free_xdpsq_desc (sq , wi , & xsk_frames , false, & bq );
478
489
}
479
490
491
+ xdp_flush_frame_bulk (& bq );
492
+ rcu_read_unlock ();
493
+
480
494
if (xsk_frames )
481
495
xsk_tx_completed (sq -> xsk_pool , xsk_frames );
482
496
}
0 commit comments