@@ -2332,8 +2332,12 @@ mvneta_swbm_add_rx_fragment(struct mvneta_port *pp,
2332
2332
skb_frag_size_set (frag , data_len );
2333
2333
__skb_frag_set_page (frag , page );
2334
2334
2335
- if (!xdp_buff_has_frags (xdp ))
2335
+ if (!xdp_buff_has_frags (xdp )) {
2336
+ sinfo -> xdp_frags_size = * size ;
2336
2337
xdp_buff_set_frags_flag (xdp );
2338
+ }
2339
+ if (page_is_pfmemalloc (page ))
2340
+ xdp_buff_set_frag_pfmemalloc (xdp );
2337
2341
} else {
2338
2342
page_pool_put_full_page (rxq -> page_pool , page , true);
2339
2343
}
@@ -2347,7 +2351,6 @@ mvneta_swbm_build_skb(struct mvneta_port *pp, struct page_pool *pool,
2347
2351
struct skb_shared_info * sinfo = xdp_get_shared_info_from_buff (xdp );
2348
2352
struct sk_buff * skb ;
2349
2353
u8 num_frags ;
2350
- int i ;
2351
2354
2352
2355
if (unlikely (xdp_buff_has_frags (xdp )))
2353
2356
num_frags = sinfo -> nr_frags ;
@@ -2362,18 +2365,12 @@ mvneta_swbm_build_skb(struct mvneta_port *pp, struct page_pool *pool,
2362
2365
skb_put (skb , xdp -> data_end - xdp -> data );
2363
2366
skb -> ip_summed = mvneta_rx_csum (pp , desc_status );
2364
2367
2365
- if (likely (!xdp_buff_has_frags (xdp )))
2366
- goto out ;
2367
-
2368
- for (i = 0 ; i < num_frags ; i ++ ) {
2369
- skb_frag_t * frag = & sinfo -> frags [i ];
2370
-
2371
- skb_add_rx_frag (skb , skb_shinfo (skb )-> nr_frags ,
2372
- skb_frag_page (frag ), skb_frag_off (frag ),
2373
- skb_frag_size (frag ), PAGE_SIZE );
2374
- }
2368
+ if (unlikely (xdp_buff_has_frags (xdp )))
2369
+ xdp_update_skb_shared_info (skb , num_frags ,
2370
+ sinfo -> xdp_frags_size ,
2371
+ num_frags * xdp -> frame_sz ,
2372
+ xdp_buff_is_frag_pfmemalloc (xdp ));
2375
2373
2376
- out :
2377
2374
return skb ;
2378
2375
}
2379
2376
0 commit comments