• L
    pipe: avoid unnecessary EPOLLET wakeups under normal loads · 3b844826
    Linus Torvalds 提交于
    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: Nkernel test robot <oliver.sang@intel.com>
    Tested-by: NSandeep Patil <sspatil@android.com>
    Tested-by: NMel Gorman <mgorman@techsingularity.net>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    3b844826
pipe_fs_i.h 8.7 KB