• Linus Torvalds's avatar
    pipe: avoid unnecessary EPOLLET wakeups under normal loads · 3b844826
    Linus Torvalds authored
    I had forgotten just how sensitive hackbench is to extra pipe wakeups,
    and commit 3a34b13a ("pipe: make pipe writes always wake up
    readers") ended up causing a quite noticeable regression on larger
    machines.
    
    Now, hackbench isn't necessarily a hugely meaningful benchmark, and it's
    not clear that this matters in real life all that much, but as Mel
    points out, it's used often enough when comparing kernels and so the
    performance regression shows up like a sore thumb.
    
    It's easy enough to fix at least for the common cases where pipes are
    used purely for data transfer, and you never have any exciting poll
    usage at all.  So set a special 'poll_usage' flag when there is polling
    activity, and make the ugly "EPOLLET has crazy legacy expectations"
    semantics explicit to only that case.
    
    I would love to limit it to just the broken EPOLLET case, but the pipe
    code can't see the difference between epoll and regular select/poll, so
    any non-read/write waiting will trigger the extra wakeup behavior.  That
    is sufficient for at least the hackbench case.
    
    Apart from making the odd extra wakeup cases more explicitly about
    EPOLLET, this also makes the extra wakeup be at the _end_ of the pipe
    write, not at the first write chunk.  That is actually much saner
    semantics (as much as you can call any of the legacy edge-triggered
    expectations for EPOLLET "sane") since it means that you know the wakeup
    will happen once the write is done, rather than possibly in the middle
    of one.
    
    [ For stable people: I'm putting a "Fixes" tag on this, but I leave it
      up to you to decide whether you actually want to backport it or not.
      It likely has no impact outside of synthetic benchmarks  - Linus ]
    
    Link: https://lore.kernel.org/lkml/20210802024945.GA8372@xsang-OptiPlex-9020/
    Fixes: 3a34b13a ("pipe: make pipe writes always wake up readers")
    Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
    Tested-by: default avatarSandeep Patil <sspatil@android.com>
    Tested-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3b844826
pipe.c 34.7 KB