]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
xdp: hold device for umem regardless of zero-copy mode
authorIlya Maximets <i.maximets@samsung.com>
Fri, 28 Jun 2019 08:04:06 +0000 (11:04 +0300)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 3 Jul 2019 13:10:55 +0000 (15:10 +0200)
Device pointer stored in umem regardless of zero-copy mode,
so we heed to hold the device in all cases.

Fixes: c9b47cc1fabc ("xsk: fix bug when trying to use both copy and zero-copy on one queue id")
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Acked-by: Jonathan Lemon <jonathan.lemon@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
net/xdp/xdp_umem.c

index 9c6de4f114f84cc17b442294a2049d8a8cd87002..267b82a4cbcf864235fb8e8b8a26b0e0dd6accf3 100644 (file)
@@ -105,6 +105,9 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
 
        umem->dev = dev;
        umem->queue_id = queue_id;
+
+       dev_hold(dev);
+
        if (force_copy)
                /* For copy-mode, we are done. */
                goto out_rtnl_unlock;
@@ -124,7 +127,6 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
                goto err_unreg_umem;
        rtnl_unlock();
 
-       dev_hold(dev);
        umem->zc = true;
        return 0;
 
@@ -163,10 +165,9 @@ static void xdp_umem_clear_dev(struct xdp_umem *umem)
        xdp_clear_umem_at_qid(umem->dev, umem->queue_id);
        rtnl_unlock();
 
-       if (umem->zc) {
-               dev_put(umem->dev);
-               umem->zc = false;
-       }
+       dev_put(umem->dev);
+       umem->dev = NULL;
+       umem->zc = false;
 }
 
 static void xdp_umem_unpin_pages(struct xdp_umem *umem)