mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
virtio_net: introduce virtnet_build_skb()
This logic is used in multiple places, now we separate it into a helper. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
19e8c85e33
commit
21e26a71f5
|
|
@ -443,6 +443,22 @@ static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx)
|
|||
return (unsigned long)mrg_ctx & ((1 << MRG_CTX_HEADER_SHIFT) - 1);
|
||||
}
|
||||
|
||||
static struct sk_buff *virtnet_build_skb(void *buf, unsigned int buflen,
|
||||
unsigned int headroom,
|
||||
unsigned int len)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = build_skb(buf, buflen);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
||||
skb_reserve(skb, headroom);
|
||||
skb_put(skb, len);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
/* Called from bottom half context */
|
||||
static struct sk_buff *page_to_skb(struct virtnet_info *vi,
|
||||
struct receive_queue *rq,
|
||||
|
|
@ -476,13 +492,10 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
|
|||
|
||||
/* copy small packet so we can reuse these pages */
|
||||
if (!NET_IP_ALIGN && len > GOOD_COPY_LEN && tailroom >= shinfo_size) {
|
||||
skb = build_skb(buf, truesize);
|
||||
skb = virtnet_build_skb(buf, truesize, p - buf, len);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
||||
skb_reserve(skb, p - buf);
|
||||
skb_put(skb, len);
|
||||
|
||||
page = (struct page *)page->private;
|
||||
if (page)
|
||||
give_pages(rq, page);
|
||||
|
|
@ -946,13 +959,10 @@ static struct sk_buff *receive_small_build_skb(struct virtnet_info *vi,
|
|||
buflen = SKB_DATA_ALIGN(GOOD_PACKET_LEN + headroom) +
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
||||
|
||||
skb = build_skb(buf, buflen);
|
||||
if (!skb)
|
||||
skb = virtnet_build_skb(buf, buflen, headroom, len);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
||||
skb_reserve(skb, headroom);
|
||||
skb_put(skb, len);
|
||||
|
||||
buf += header_offset;
|
||||
memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
|
||||
|
||||
|
|
@ -1028,12 +1038,10 @@ static struct sk_buff *receive_small_xdp(struct net_device *dev,
|
|||
goto err_xdp;
|
||||
}
|
||||
|
||||
skb = build_skb(buf, buflen);
|
||||
if (!skb)
|
||||
skb = virtnet_build_skb(buf, buflen, xdp.data - buf, len);
|
||||
if (unlikely(!skb))
|
||||
goto err;
|
||||
|
||||
skb_reserve(skb, xdp.data - buf);
|
||||
skb_put(skb, len);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user