mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00: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
1 changed files with 21 additions and 13 deletions
|
@ -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 a new issue