OSDN Git Service

xsk: add missing write- and data-dependency barrier
authorBjörn Töpel <bjorn.topel@intel.com>
Tue, 22 May 2018 07:35:01 +0000 (09:35 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 22 May 2018 08:25:06 +0000 (10:25 +0200)
Here, we add a missing write-barrier, and use READ_ONCE for the
data-dependency barrier.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
net/xdp/xsk.c

index 378dd92..01f010e 100644 (file)
@@ -228,6 +228,8 @@ static int xsk_init_queue(u32 entries, struct xsk_queue **queue,
        if (!q)
                return -ENOMEM;
 
+       /* Make sure queue is ready before it can be seen by others */
+       smp_wmb();
        *queue = q;
        return 0;
 }
@@ -532,21 +534,23 @@ static int xsk_mmap(struct file *file, struct socket *sock,
        unsigned long size = vma->vm_end - vma->vm_start;
        struct xdp_sock *xs = xdp_sk(sock->sk);
        struct xsk_queue *q = NULL;
+       struct xdp_umem *umem;
        unsigned long pfn;
        struct page *qpg;
 
        if (offset == XDP_PGOFF_RX_RING) {
-               q = xs->rx;
+               q = READ_ONCE(xs->rx);
        } else if (offset == XDP_PGOFF_TX_RING) {
-               q = xs->tx;
+               q = READ_ONCE(xs->tx);
        } else {
-               if (!xs->umem)
+               umem = READ_ONCE(xs->umem);
+               if (!umem)
                        return -EINVAL;
 
                if (offset == XDP_UMEM_PGOFF_FILL_RING)
-                       q = xs->umem->fq;
+                       q = READ_ONCE(umem->fq);
                else if (offset == XDP_UMEM_PGOFF_COMPLETION_RING)
-                       q = xs->umem->cq;
+                       q = READ_ONCE(umem->cq);
        }
 
        if (!q)