@@ -487,14 +487,13 @@ static bool ionic_run_xdp(struct ionic_rx_stats *stats,
487
487
struct ionic_buf_info * buf_info ,
488
488
int len )
489
489
{
490
+ int remain_len , frag_len , i , err = 0 ;
491
+ struct skb_shared_info * sinfo ;
490
492
u32 xdp_action = XDP_ABORTED ;
491
493
struct xdp_buff xdp_buf ;
492
494
struct ionic_queue * txq ;
493
495
struct netdev_queue * nq ;
494
496
struct xdp_frame * xdpf ;
495
- int remain_len ;
496
- int frag_len ;
497
- int err = 0 ;
498
497
499
498
xdp_init_buff (& xdp_buf , IONIC_PAGE_SIZE , rxq -> xdp_rxq_info );
500
499
frag_len = min_t (u16 , len , IONIC_XDP_MAX_LINEAR_MTU + VLAN_ETH_HLEN );
@@ -513,7 +512,6 @@ static bool ionic_run_xdp(struct ionic_rx_stats *stats,
513
512
*/
514
513
remain_len = len - frag_len ;
515
514
if (remain_len ) {
516
- struct skb_shared_info * sinfo ;
517
515
struct ionic_buf_info * bi ;
518
516
skb_frag_t * frag ;
519
517
@@ -576,7 +574,6 @@ static bool ionic_run_xdp(struct ionic_rx_stats *stats,
576
574
577
575
dma_unmap_page (rxq -> dev , buf_info -> dma_addr ,
578
576
IONIC_PAGE_SIZE , DMA_FROM_DEVICE );
579
-
580
577
err = ionic_xdp_post_frame (txq , xdpf , XDP_TX ,
581
578
buf_info -> page ,
582
579
buf_info -> page_offset ,
@@ -587,12 +584,22 @@ static bool ionic_run_xdp(struct ionic_rx_stats *stats,
587
584
goto out_xdp_abort ;
588
585
}
589
586
buf_info -> page = NULL ;
587
+ if (xdp_frame_has_frags (xdpf )) {
588
+ for (i = 0 ; i < sinfo -> nr_frags ; i ++ ) {
589
+ buf_info ++ ;
590
+ dma_unmap_page (rxq -> dev , buf_info -> dma_addr ,
591
+ IONIC_PAGE_SIZE , DMA_FROM_DEVICE );
592
+ buf_info -> page = NULL ;
593
+ }
594
+ }
595
+
590
596
stats -> xdp_tx ++ ;
591
597
592
598
/* the Tx completion will free the buffers */
593
599
break ;
594
600
595
601
case XDP_REDIRECT :
602
+ xdpf = xdp_convert_buff_to_frame (& xdp_buf );
596
603
/* unmap the pages before handing them to a different device */
597
604
dma_unmap_page (rxq -> dev , buf_info -> dma_addr ,
598
605
IONIC_PAGE_SIZE , DMA_FROM_DEVICE );
@@ -603,6 +610,15 @@ static bool ionic_run_xdp(struct ionic_rx_stats *stats,
603
610
goto out_xdp_abort ;
604
611
}
605
612
buf_info -> page = NULL ;
613
+ if (xdp_frame_has_frags (xdpf )) {
614
+ for (i = 0 ; i < sinfo -> nr_frags ; i ++ ) {
615
+ buf_info ++ ;
616
+ dma_unmap_page (rxq -> dev , buf_info -> dma_addr ,
617
+ IONIC_PAGE_SIZE , DMA_FROM_DEVICE );
618
+ buf_info -> page = NULL ;
619
+ }
620
+ }
621
+
606
622
rxq -> xdp_flush = true;
607
623
stats -> xdp_redirect ++ ;
608
624
break ;
0 commit comments