@@ -2156,7 +2156,6 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
21562156 struct virtnet_rq_stats * stats )
21572157{
21582158 struct virtio_net_hdr_mrg_rxbuf * hdr = buf ;
2159- unsigned int headroom , tailroom , room ;
21602159 struct skb_shared_info * shinfo ;
21612160 unsigned int xdp_frags_truesz = 0 ;
21622161 unsigned int truesize ;
@@ -2202,20 +2201,14 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
22022201 page = virt_to_head_page (buf );
22032202 offset = buf - page_address (page );
22042203
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 )) {
22122205 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 );
22162206 goto err ;
22172207 }
22182208
2209+ truesize = mergeable_ctx_to_truesize (ctx );
2210+ xdp_frags_truesz += truesize ;
2211+
22192212 frag = & shinfo -> frags [shinfo -> nr_frags ++ ];
22202213 skb_frag_fill_page_desc (frag , page , offset , len );
22212214 if (page_is_pfmemalloc (page ))
@@ -2429,18 +2422,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
24292422 struct sk_buff * head_skb , * curr_skb ;
24302423 unsigned int truesize = mergeable_ctx_to_truesize (ctx );
24312424 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 );
24342425
24352426 head_skb = NULL ;
24362427 u64_stats_add (& stats -> bytes , len - vi -> hdr_len );
24372428
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 ))
24422430 goto err_skb ;
2443- }
24442431
24452432 if (unlikely (vi -> xdp_enabled )) {
24462433 struct bpf_prog * xdp_prog ;
@@ -2475,17 +2462,10 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
24752462 u64_stats_add (& stats -> bytes , len );
24762463 page = virt_to_head_page (buf );
24772464
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 ))
24862466 goto err_skb ;
2487- }
24882467
2468+ truesize = mergeable_ctx_to_truesize (ctx );
24892469 curr_skb = virtnet_skb_append_frag (head_skb , curr_skb , page ,
24902470 buf , len , truesize );
24912471 if (!curr_skb )
0 commit comments