@@ -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 ))
@@ -1332,7 +1333,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
1332
1333
rcu_read_unlock ();
1333
1334
1334
1335
skip_xdp :
1335
- head_skb = page_to_skb (vi , rq , page , offset , len , truesize );
1336
+ head_skb = page_to_skb (vi , rq , page , offset , len , truesize , headroom );
1336
1337
curr_skb = head_skb ;
1337
1338
1338
1339
if (unlikely (!curr_skb ))
0 commit comments