• Al Viro's avatar
    splice: lift pipe_lock out of splice_to_pipe() · 8924feff
    Al Viro authored
    * splice_to_pipe() stops at pipe overflow and does *not* take pipe_lock
    * ->splice_read() instances do the same
    * vmsplice_to_pipe() and do_splice() (ultimate callers of splice_to_pipe())
      arrange for waiting, looping, etc. themselves.
    
    That should make pipe_lock the outermost one.
    
    Unfortunately, existing rules for the amount passed by vmsplice_to_pipe()
    and do_splice() are quite ugly _and_ userland code can be easily broken
    by changing those.  It's not even "no more than the maximal capacity of
    this pipe" - it's "once we'd fed pipe->nr_buffers pages into the pipe,
    leave instead of waiting".
    
    Considering how poorly these rules are documented, let's try "wait for some
    space to appear, unless given SPLICE_F_NONBLOCK, then push into pipe
    and if we run into overflow, we are done".
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    8924feff
dev.c 51.5 KB