This patch introduce a new function that releases the
xdp shinfo. The subsequent patch will reuse this function.

Signed-off-by: Xuan Zhuo <xuanz...@linux.alibaba.com>
---
 drivers/net/virtio_net.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 72b9d6ee4024..09aed60e2f51 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -798,6 +798,21 @@ static int virtnet_xdp_xmit(struct net_device *dev,
        return ret;
 }
 
+static void put_xdp_frags(struct xdp_buff *xdp)
+{
+       struct skb_shared_info *shinfo;
+       struct page *xdp_page;
+       int i;
+
+       if (xdp_buff_has_frags(xdp)) {
+               shinfo = xdp_get_shared_info_from_buff(xdp);
+               for (i = 0; i < shinfo->nr_frags; i++) {
+                       xdp_page = skb_frag_page(&shinfo->frags[i]);
+                       put_page(xdp_page);
+               }
+       }
+}
+
 static int virtnet_xdp_handler(struct bpf_prog *xdp_prog, struct xdp_buff *xdp,
                               struct net_device *dev,
                               unsigned int *xdp_xmit,
@@ -1312,12 +1327,9 @@ static struct sk_buff *receive_mergeable(struct 
net_device *dev,
        xdp_prog = rcu_dereference(rq->xdp_prog);
        if (xdp_prog) {
                unsigned int xdp_frags_truesz = 0;
-               struct skb_shared_info *shinfo;
-               struct page *xdp_page;
                struct xdp_buff xdp;
                void *data;
                u32 act;
-               int i;
 
                data = mergeable_xdp_prepare(vi, rq, xdp_prog, ctx, &frame_sz, 
&num_buf, &page,
                                             offset, &len, hdr);
@@ -1348,14 +1360,7 @@ static struct sk_buff *receive_mergeable(struct 
net_device *dev,
                        goto err_xdp_frags;
                }
 err_xdp_frags:
-               if (xdp_buff_has_frags(&xdp)) {
-                       shinfo = xdp_get_shared_info_from_buff(&xdp);
-                       for (i = 0; i < shinfo->nr_frags; i++) {
-                               xdp_page = skb_frag_page(&shinfo->frags[i]);
-                               put_page(xdp_page);
-                       }
-               }
-
+               put_xdp_frags(&xdp);
                goto err_xdp;
        }
        rcu_read_unlock();
-- 
2.32.0.3.g01195cf9f

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to