Skip to content

Commit 0450479

Browse files
committed
Merge branch 'virtio_net-xdp-bugs'
Xuan Zhuo says: ==================== virtio_net: fix two bugs related to XDP This patch set fixes two bugs related to XDP. These two patch is not associated. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 1a87e64 + 1a3bd6e commit 0450479

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

drivers/net/virtio_net.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,8 @@ static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx)
446446
static struct sk_buff *page_to_skb(struct virtnet_info *vi,
447447
struct receive_queue *rq,
448448
struct page *page, unsigned int offset,
449-
unsigned int len, unsigned int truesize)
449+
unsigned int len, unsigned int truesize,
450+
unsigned int headroom)
450451
{
451452
struct sk_buff *skb;
452453
struct virtio_net_hdr_mrg_rxbuf *hdr;
@@ -464,11 +465,11 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
464465
else
465466
hdr_padded_len = sizeof(struct padded_vnet_hdr);
466467

467-
buf = p;
468+
buf = p - headroom;
468469
len -= hdr_len;
469470
offset += hdr_padded_len;
470471
p += hdr_padded_len;
471-
tailroom = truesize - hdr_padded_len - len;
472+
tailroom = truesize - headroom - hdr_padded_len - len;
472473

473474
shinfo_size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
474475

@@ -1009,7 +1010,7 @@ static struct sk_buff *receive_big(struct net_device *dev,
10091010
{
10101011
struct page *page = buf;
10111012
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);
10131014

10141015
stats->bytes += len - vi->hdr_len;
10151016
if (unlikely(!skb))
@@ -1272,9 +1273,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
12721273

12731274
switch (act) {
12741275
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+
12751280
if (unlikely(xdp_page != page))
12761281
put_page(page);
1277-
head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz);
12781282
rcu_read_unlock();
12791283
return head_skb;
12801284
case XDP_TX:
@@ -1332,7 +1336,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
13321336
rcu_read_unlock();
13331337

13341338
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);
13361340
curr_skb = head_skb;
13371341

13381342
if (unlikely(!curr_skb))

0 commit comments

Comments
 (0)