• David Howells's avatar
    watch_queue: Fix lack of barrier/sync/lock between post and read · 2ed147f0
    David Howells authored
    There's nothing to synchronise post_one_notification() versus
    pipe_read().  Whilst posting is done under pipe->rd_wait.lock, the
    reader only takes pipe->mutex which cannot bar notification posting as
    that may need to be made from contexts that cannot sleep.
    
    Fix this by setting pipe->head with a barrier in post_one_notification()
    and reading pipe->head with a barrier in pipe_read().
    
    If that's not sufficient, the rd_wait.lock will need to be taken,
    possibly in a ->confirm() op so that it only applies to notifications.
    The lock would, however, have to be dropped before copy_page_to_iter()
    is invoked.
    
    Fixes: c73be61c ("pipe: Add general notification queue support")
    Reported-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2ed147f0
pipe.c 36 KB