Andy Lutomirski <luto@xxxxxxxxxx> wrote: > I can open a normal pipe from userspace (with pipe() or pipe2()), and > I can have two threads. One thread writes to the pipe with write(). > The other thread writes with splice(). Everything works fine. Yes. Every operation you do on a pipe from userspace is serialised with the pipe mutex - and both ends share the same pipe. > What's special about notifications? The post_notification() cannot take the pipe mutex. It has to be callable from softirq context. Linus's idea is that when you're actually altering the ring pointers you should hold the wake-queue spinlock, and post_notification() holds the wake queue spinlock for the duration of the operation. This means that post_notification() can be writing to the pipe whilst a userspace-invoked operation is holding the pipe mutex and is also doing something to the ring. David