• David Howells's avatar
    pipe: Rearrange sequence in pipe_write() to preallocate slot · a194dfe6
    David Howells authored
    Rearrange the sequence in pipe_write() so that the allocation of the new
    buffer, the allocation of a ring slot and the attachment to the ring is
    done under the pipe wait spinlock and then the lock is dropped and the
    buffer can be filled.
    
    The data copy needs to be done with the spinlock unheld and irqs enabled,
    so the lock needs to be dropped first.  However, the reader can't progress
    as we're holding pipe->mutex.
    
    We also need to drop the lock as that would impact others looking at the
    pipe waitqueue, such as poll(), the consumer and a future kernel message
    writer.
    
    We just abandon the preallocated slot if we get a copy error.  Future
    writes may continue it and a future read will eventually recycle it.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    a194dfe6
pipe.c 29 KB