virtio_net: introduce receive_small_build_xdp
Simplifying receive_small() function. Bringing the logic relating to build_skb together. 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
aef76506bc
commit
19e8c85e33
@ -931,6 +931,34 @@ err_buf:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct sk_buff *receive_small_build_skb(struct virtnet_info *vi,
|
||||||
|
unsigned int xdp_headroom,
|
||||||
|
void *buf,
|
||||||
|
unsigned int len)
|
||||||
|
{
|
||||||
|
unsigned int header_offset;
|
||||||
|
unsigned int headroom;
|
||||||
|
unsigned int buflen;
|
||||||
|
struct sk_buff *skb;
|
||||||
|
|
||||||
|
header_offset = VIRTNET_RX_PAD + xdp_headroom;
|
||||||
|
headroom = vi->hdr_len + header_offset;
|
||||||
|
buflen = SKB_DATA_ALIGN(GOOD_PACKET_LEN + headroom) +
|
||||||
|
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
||||||
|
|
||||||
|
skb = build_skb(buf, buflen);
|
||||||
|
if (!skb)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
skb_reserve(skb, headroom);
|
||||||
|
skb_put(skb, len);
|
||||||
|
|
||||||
|
buf += header_offset;
|
||||||
|
memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
|
||||||
|
|
||||||
|
return skb;
|
||||||
|
}
|
||||||
|
|
||||||
static struct sk_buff *receive_small_xdp(struct net_device *dev,
|
static struct sk_buff *receive_small_xdp(struct net_device *dev,
|
||||||
struct virtnet_info *vi,
|
struct virtnet_info *vi,
|
||||||
struct receive_queue *rq,
|
struct receive_queue *rq,
|
||||||
@ -1030,9 +1058,6 @@ static struct sk_buff *receive_small(struct net_device *dev,
|
|||||||
{
|
{
|
||||||
unsigned int xdp_headroom = (unsigned long)ctx;
|
unsigned int xdp_headroom = (unsigned long)ctx;
|
||||||
struct page *page = virt_to_head_page(buf);
|
struct page *page = virt_to_head_page(buf);
|
||||||
unsigned int header_offset;
|
|
||||||
unsigned int headroom;
|
|
||||||
unsigned int buflen;
|
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
len -= vi->hdr_len;
|
len -= vi->hdr_len;
|
||||||
@ -1060,20 +1085,9 @@ static struct sk_buff *receive_small(struct net_device *dev,
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
header_offset = VIRTNET_RX_PAD + xdp_headroom;
|
skb = receive_small_build_skb(vi, xdp_headroom, buf, len);
|
||||||
headroom = vi->hdr_len + header_offset;
|
if (likely(skb))
|
||||||
buflen = SKB_DATA_ALIGN(GOOD_PACKET_LEN + headroom) +
|
return skb;
|
||||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
|
||||||
|
|
||||||
skb = build_skb(buf, buflen);
|
|
||||||
if (!skb)
|
|
||||||
goto err;
|
|
||||||
skb_reserve(skb, headroom);
|
|
||||||
skb_put(skb, len);
|
|
||||||
|
|
||||||
buf += header_offset;
|
|
||||||
memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
|
|
||||||
return skb;
|
|
||||||
|
|
||||||
err:
|
err:
|
||||||
stats->drops++;
|
stats->drops++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user