On Fri, Nov 1, 2019 at 10:34 AM David Howells <dhowells@xxxxxxxxxx> wrote: > (1) It removes the nr_exclusive argument from __wake_up_sync_key() as this > is always 1. This prepares for step 2. > > (2) Adds wake_up_interruptible_sync_poll_locked() so that poll can be > woken up from a function that's holding the poll waitqueue spinlock. Side note: we have a couple of cases where I don't think we should use the "sync" version at all. Both pipe_read() and pipe_write() have that if (do_wakeup) { wake_up_interruptible_sync_poll(&pipe->wait, ... code at the end, outside the loop. But those two wake-ups aren't actually synchronous. A sync wake is supposedly something where the waker is just about to go to sleep, telling the scheduler that "don't bother trying to pick another cpu, this process is going to sleep and you can stay here". I'm not sure how much this matters, but it does strike me that it's wrong. We're not going to sleep at all in that case - this is not the "I filled the whole buffer, so I'm going to sleep" case (or the "I've read all the data, I'm waiting for more". It's entirely possible that we always wake pipe wakeups to be sync just because it's a common pattern (and a common benchmark), but this series made me look at it again. Particularly since David has benchmarks that don't seem to show a lot of fluctuation with his changes - I wonder how much the sync logic buys us (or hurts us)? Linus