Thread (3 messages) 3 messages, 3 authors, 2019-12-02

Re: [PATCH bpf] xsk: add missing memory barrier in xskq_has_addrs()

From: Magnus Karlsson <hidden>
Date: 2019-12-02 12:31:51
Also in: bpf

On Mon, Dec 2, 2019 at 10:30 AM Maxim Mikityanskiy [off-list ref] wrote:
On 2019-11-29 11:51, Magnus Karlsson wrote:
quoted
The rings in AF_XDP between user space and kernel space have the
following semantics:

producer                         consumer

if (LOAD ->consumer) {           LOAD ->producer
                    (A)           smp_rmb()       (C)
    STORE $data                   LOAD $data
    smp_wmb()       (B)           smp_mb()        (D)
    STORE ->producer              STORE ->consumer
}

The consumer function xskq_has_addrs() below loads the producer
pointer and updates the locally cached copy of it. However, it does
not issue the smp_rmb() operation required by the lockless ring. This
would have been ok had the function not updated the locally cached
copy, as that could not have resulted in new data being read from the
ring. But as it updates the local producer pointer, a subsequent peek
operation, such as xskq_peek_addr(), might load data from the ring
without issuing the required smp_rmb() memory barrier.
Thanks for paying attention to it, but I don't think it can really
happen. xskq_has_addrs only updates prod_tail, but xskq_peek_addr
doesn't use prod_tail, it reads from cons_tail to cons_head, and every
cons_head update has the necessary smp_rmb.
You are correct, it cannot happen. I am working on a 10 part patch set
that simplifies the rings and was staring blindly at that. In that
patch set it can happen since I only have two cached pointers instead
of four so there is a dependency, but not in the current code. I will
include this barrier in my patch set at the appropriate place. Thanks
for looking into this Maxim.

Please drop this patch.

/Magnus
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help