Skip to content
  • Paolo Bonzini's avatar
    eventfd: document lockless access in eventfd_poll · a484c3dd
    Paolo Bonzini authored
    Since commit e22553e2
    
     ("eventfd: don't take the spinlock in
    eventfd_poll", 2015-02-17), eventfd is reading ctx->count outside
    ctx->wqh.lock.
    
    However, things aren't as simple as the read barrier in eventfd_poll
    would suggest.  In fact, the read barrier, besides lacking a comment, is
    not paired in any obvious manner with another read barrier, and it is
    pointless because it is sitting between a write (deep in poll_wait) and
    the read of ctx->count.  The read barrier is acting just as a compiler
    barrier, for which we can use READ_ONCE instead.  This is what the code
    change in this patch does.
    
    The documentation change is just as important, however.  The question,
    posed by Andrea Arcangeli, is then why the thing is safe on
    architectures where spin_unlock does not imply a store-load memory
    barrier.  The answer is that it's safe because writes of ctx->count use
    the same lock as poll_wait, and hence an acquire barrier implicit in
    poll_wait provides the necessary synchronization between eventfd_poll
    and callers of wake_up_locked_poll.  This is sort of mentioned in the
    commit message with respect to eventfd_ctx_read ("eventfd_read is
    similar, it will do a single decrement with the lock held") but it
    applies to all other callers too.  It's tricky enough that it should be
    documented in the code.
    
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
    Cc: Chris Mason <clm@fb.com>
    Cc: Davide Libenzi <davidel@xmailserver.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a484c3dd