This commit separates the function receive_buf(), then we wrap the logic
of handling the skb to an independent function virtnet_receive_done().
The subsequent commit will reuse it.

Signed-off-by: Xuan Zhuo <xuanz...@linux.alibaba.com>
---
 drivers/net/virtio/virtnet_main.c | 56 ++++++++++++++++++-------------
 1 file changed, 32 insertions(+), 24 deletions(-)

diff --git a/drivers/net/virtio/virtnet_main.c 
b/drivers/net/virtio/virtnet_main.c
index fcfe190300a6..abb8989d2e0a 100644
--- a/drivers/net/virtio/virtnet_main.c
+++ b/drivers/net/virtio/virtnet_main.c
@@ -1713,32 +1713,11 @@ static void virtio_skb_set_hash(const struct 
virtio_net_hdr_v1_hash *hdr_hash,
        skb_set_hash(skb, __le32_to_cpu(hdr_hash->hash_value), rss_hash_type);
 }
 
-static void receive_buf(struct virtnet_info *vi, struct virtnet_rq *rq,
-                       void *buf, unsigned int len, void **ctx,
-                       unsigned int *xdp_xmit,
-                       struct virtnet_rq_stats *stats)
+static void virtnet_receive_done(struct virtnet_info *vi, struct virtnet_rq 
*rq,
+                                struct sk_buff *skb)
 {
-       struct net_device *dev = vi->dev;
-       struct sk_buff *skb;
        struct virtio_net_common_hdr *hdr;
-
-       if (unlikely(len < vi->hdr_len + ETH_HLEN)) {
-               pr_debug("%s: short packet %i\n", dev->name, len);
-               DEV_STATS_INC(dev, rx_length_errors);
-               virtnet_rq_free_buf(vi, rq, buf);
-               return;
-       }
-
-       if (vi->mergeable_rx_bufs)
-               skb = receive_mergeable(dev, vi, rq, buf, ctx, len, xdp_xmit,
-                                       stats);
-       else if (vi->big_packets)
-               skb = receive_big(dev, vi, rq, buf, len, stats);
-       else
-               skb = receive_small(dev, vi, rq, buf, ctx, len, xdp_xmit, 
stats);
-
-       if (unlikely(!skb))
-               return;
+       struct net_device *dev = vi->dev;
 
        hdr = skb_vnet_common_hdr(skb);
        if (dev->features & NETIF_F_RXHASH && vi->has_rss_hash_report)
@@ -1768,6 +1747,35 @@ static void receive_buf(struct virtnet_info *vi, struct 
virtnet_rq *rq,
        dev_kfree_skb(skb);
 }
 
+static void receive_buf(struct virtnet_info *vi, struct virtnet_rq *rq,
+                       void *buf, unsigned int len, void **ctx,
+                       unsigned int *xdp_xmit,
+                       struct virtnet_rq_stats *stats)
+{
+       struct net_device *dev = vi->dev;
+       struct sk_buff *skb;
+
+       if (unlikely(len < vi->hdr_len + ETH_HLEN)) {
+               pr_debug("%s: short packet %i\n", dev->name, len);
+               DEV_STATS_INC(dev, rx_length_errors);
+               virtnet_rq_free_buf(vi, rq, buf);
+               return;
+       }
+
+       if (vi->mergeable_rx_bufs)
+               skb = receive_mergeable(dev, vi, rq, buf, ctx, len, xdp_xmit,
+                                       stats);
+       else if (vi->big_packets)
+               skb = receive_big(dev, vi, rq, buf, len, stats);
+       else
+               skb = receive_small(dev, vi, rq, buf, ctx, len, xdp_xmit, 
stats);
+
+       if (unlikely(!skb))
+               return;
+
+       virtnet_receive_done(vi, rq, skb);
+}
+
 /* Unlike mergeable buffers, all buffers are allocated to the
  * same size, except for the headroom. For this reason we do
  * not need to use  mergeable_len_to_ctx here - it is enough
-- 
2.32.0.3.g01195cf9f


Reply via email to