@@ -446,7 +446,8 @@ static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx)
446
446
static struct sk_buff * page_to_skb (struct virtnet_info * vi ,
447
447
struct receive_queue * rq ,
448
448
struct page * page , unsigned int offset ,
449
- unsigned int len , unsigned int truesize )
449
+ unsigned int len , unsigned int truesize ,
450
+ unsigned int headroom )
450
451
{
451
452
struct sk_buff * skb ;
452
453
struct virtio_net_hdr_mrg_rxbuf * hdr ;
@@ -464,11 +465,11 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
464
465
else
465
466
hdr_padded_len = sizeof (struct padded_vnet_hdr );
466
467
467
- buf = p ;
468
+ buf = p - headroom ;
468
469
len -= hdr_len ;
469
470
offset += hdr_padded_len ;
470
471
p += hdr_padded_len ;
471
- tailroom = truesize - hdr_padded_len - len ;
472
+ tailroom = truesize - headroom - hdr_padded_len - len ;
472
473
473
474
shinfo_size = SKB_DATA_ALIGN (sizeof (struct skb_shared_info ));
474
475
@@ -1009,7 +1010,7 @@ static struct sk_buff *receive_big(struct net_device *dev,
1009
1010
{
1010
1011
struct page * page = buf ;
1011
1012
struct sk_buff * skb =
1012
- page_to_skb (vi , rq , page , 0 , len , PAGE_SIZE );
1013
+ page_to_skb (vi , rq , page , 0 , len , PAGE_SIZE , 0 );
1013
1014
1014
1015
stats -> bytes += len - vi -> hdr_len ;
1015
1016
if (unlikely (!skb ))
@@ -1272,9 +1273,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
1272
1273
1273
1274
switch (act ) {
1274
1275
case XDP_PASS :
1276
+ head_skb = build_skb_from_xdp_buff (dev , vi , & xdp , xdp_frags_truesz );
1277
+ if (unlikely (!head_skb ))
1278
+ goto err_xdp_frags ;
1279
+
1275
1280
if (unlikely (xdp_page != page ))
1276
1281
put_page (page );
1277
- head_skb = build_skb_from_xdp_buff (dev , vi , & xdp , xdp_frags_truesz );
1278
1282
rcu_read_unlock ();
1279
1283
return head_skb ;
1280
1284
case XDP_TX :
@@ -1332,7 +1336,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
1332
1336
rcu_read_unlock ();
1333
1337
1334
1338
skip_xdp :
1335
- head_skb = page_to_skb (vi , rq , page , offset , len , truesize );
1339
+ head_skb = page_to_skb (vi , rq , page , offset , len , truesize , headroom );
1336
1340
curr_skb = head_skb ;
1337
1341
1338
1342
if (unlikely (!curr_skb ))
0 commit comments