Thread (63 messages) 63 messages, 12 authors, 2015-12-04

Re: [PATCH 10/23] userfaultfd: add new syscall to provide memory externalization

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2015-05-14 17:49:10
Also in: kvm, linux-mm, lkml, qemu-devel

On Thu, May 14, 2015 at 10:31 AM, Andrea Arcangeli [off-list ref] wrote:
+static __always_inline void wake_userfault(struct userfaultfd_ctx *ctx,
+                                          struct userfaultfd_wake_range *range)
+{
+       if (waitqueue_active(&ctx->fault_wqh))
+               __wake_userfault(ctx, range);
+}
Pretty much every single time people use this "if
(waitqueue_active())" model, it tends to be a bug, because it means
that there is zero serialization with people who are just about to go
to sleep. It's fundamentally racy against all the "wait_event()" loops
that carefully do memory barriers between testing conditions and going
to sleep, because the memory barriers now don't exist on the waking
side.

So I'm making a new rule: if you use waitqueue_active(), I want an
explanation for why it's not racy with the waiter. A big comment about
the memory ordering, or about higher-level locks that are held by the
caller, or something.

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