• Linus Torvalds's avatar
    pipe: fix and clarify pipe write wakeup logic · 1b6b26ae
    Linus Torvalds authored
    The pipe rework ends up having been extra painful, partly becaused of
    actual bugs with ordering and caching of the pipe state, but also
    because of subtle performance issues.
    
    In particular, the pipe rework caused the kernel build to inexplicably
    slow down.
    
    The reason turns out to be that the GNU make jobserver (which limits the
    parallelism of the build) uses a pipe to implement a "token" system: a
    parallel submake will read a character from the pipe to get the job
    token before starting a new job, and will write a character back to the
    pipe when it is done.  The overall job limit is thus easily controlled
    by just writing the appropriate number of initial token characters into
    the pipe.
    
    But to work well, that really means that the old behavior of write
    wakeups being synchronous (WF_SYNC) is very important - when the pipe
    writer wakes up a reader, we want the reader to actually get scheduled
    immediately.  Otherwise you lose the parallelism of the build.
    
    The pipe rework lost that synchronous wakeup on write, and we had
    clearly all forgotten the reasons and rules for it.
    
    This rewrites the pipe write wakeup logic to do the required Wsync
    wakeups, but also clarifies the logic and avoids extraneous wakeups.
    
    It also ends up addign a number of comments about what oit does and why,
    so that we hopefully don't end up forgetting about this next time we
    change this code.
    
    Cc: David Howells <dhowells@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1b6b26ae
pipe.c 30 KB