]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/net/virtio_net.c
virtio-net: correctly handle XDP_PASS for linearized packets
[mirror_ubuntu-bionic-kernel.git] / drivers / net / virtio_net.c
index 58ad40e17a74fb455dd956ab06e83601c8c2310e..470293e2b84d4cf6bf168943ed1f0f0baabae363 100644 (file)
@@ -578,8 +578,14 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
                act = do_xdp_prog(vi, rq, xdp_prog, xdp_page, offset, len);
                switch (act) {
                case XDP_PASS:
-                       if (unlikely(xdp_page != page))
-                               __free_pages(xdp_page, 0);
+                       /* We can only create skb based on xdp_page. */
+                       if (unlikely(xdp_page != page)) {
+                               rcu_read_unlock();
+                               put_page(page);
+                               head_skb = page_to_skb(vi, rq, xdp_page,
+                                                      0, len, PAGE_SIZE);
+                               return head_skb;
+                       }
                        break;
                case XDP_TX:
                        if (unlikely(xdp_page != page))