@@ -2156,7 +2156,6 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
2156
2156
struct virtnet_rq_stats * stats )
2157
2157
{
2158
2158
struct virtio_net_hdr_mrg_rxbuf * hdr = buf ;
2159
- unsigned int headroom , tailroom , room ;
2160
2159
struct skb_shared_info * shinfo ;
2161
2160
unsigned int xdp_frags_truesz = 0 ;
2162
2161
unsigned int truesize ;
@@ -2202,20 +2201,14 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
2202
2201
page = virt_to_head_page (buf );
2203
2202
offset = buf - page_address (page );
2204
2203
2205
- truesize = mergeable_ctx_to_truesize (ctx );
2206
- headroom = mergeable_ctx_to_headroom (ctx );
2207
- tailroom = headroom ? sizeof (struct skb_shared_info ) : 0 ;
2208
- room = SKB_DATA_ALIGN (headroom + tailroom );
2209
-
2210
- xdp_frags_truesz += truesize ;
2211
- if (unlikely (len > truesize - room )) {
2204
+ if (check_mergeable_len (dev , ctx , len )) {
2212
2205
put_page (page );
2213
- pr_debug ("%s: rx error: len %u exceeds truesize %lu\n" ,
2214
- dev -> name , len , (unsigned long )(truesize - room ));
2215
- DEV_STATS_INC (dev , rx_length_errors );
2216
2206
goto err ;
2217
2207
}
2218
2208
2209
+ truesize = mergeable_ctx_to_truesize (ctx );
2210
+ xdp_frags_truesz += truesize ;
2211
+
2219
2212
frag = & shinfo -> frags [shinfo -> nr_frags ++ ];
2220
2213
skb_frag_fill_page_desc (frag , page , offset , len );
2221
2214
if (page_is_pfmemalloc (page ))
@@ -2429,18 +2422,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
2429
2422
struct sk_buff * head_skb , * curr_skb ;
2430
2423
unsigned int truesize = mergeable_ctx_to_truesize (ctx );
2431
2424
unsigned int headroom = mergeable_ctx_to_headroom (ctx );
2432
- unsigned int tailroom = headroom ? sizeof (struct skb_shared_info ) : 0 ;
2433
- unsigned int room = SKB_DATA_ALIGN (headroom + tailroom );
2434
2425
2435
2426
head_skb = NULL ;
2436
2427
u64_stats_add (& stats -> bytes , len - vi -> hdr_len );
2437
2428
2438
- if (unlikely (len > truesize - room )) {
2439
- pr_debug ("%s: rx error: len %u exceeds truesize %lu\n" ,
2440
- dev -> name , len , (unsigned long )(truesize - room ));
2441
- DEV_STATS_INC (dev , rx_length_errors );
2429
+ if (check_mergeable_len (dev , ctx , len ))
2442
2430
goto err_skb ;
2443
- }
2444
2431
2445
2432
if (unlikely (vi -> xdp_enabled )) {
2446
2433
struct bpf_prog * xdp_prog ;
@@ -2475,17 +2462,10 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
2475
2462
u64_stats_add (& stats -> bytes , len );
2476
2463
page = virt_to_head_page (buf );
2477
2464
2478
- truesize = mergeable_ctx_to_truesize (ctx );
2479
- headroom = mergeable_ctx_to_headroom (ctx );
2480
- tailroom = headroom ? sizeof (struct skb_shared_info ) : 0 ;
2481
- room = SKB_DATA_ALIGN (headroom + tailroom );
2482
- if (unlikely (len > truesize - room )) {
2483
- pr_debug ("%s: rx error: len %u exceeds truesize %lu\n" ,
2484
- dev -> name , len , (unsigned long )(truesize - room ));
2485
- DEV_STATS_INC (dev , rx_length_errors );
2465
+ if (check_mergeable_len (dev , ctx , len ))
2486
2466
goto err_skb ;
2487
- }
2488
2467
2468
+ truesize = mergeable_ctx_to_truesize (ctx );
2489
2469
curr_skb = virtnet_skb_append_frag (head_skb , curr_skb , page ,
2490
2470
buf , len , truesize );
2491
2471
if (!curr_skb )
0 commit comments