• Max Kellermann's avatar
    fs/pipe: use spinlock in pipe_read() only if there is a watch_queue · 478dbf12
    Max Kellermann authored
    If there is no watch_queue, holding the pipe mutex is enough to
    prevent concurrent writes, and we can avoid the spinlock.
    
    O_NOTIFICATION_QUEUE is an exotic and rarely used feature, and of all
    the pipes that exist at any given time, only very few actually have a
    watch_queue, therefore it appears worthwile to optimize the common
    case.
    
    This patch does not optimize pipe_resize_ring() where the spinlocks
    could be avoided as well; that does not seem like a worthwile
    optimization because this function is not called often.
    
    Related commits:
    
    - commit 8df44129 ("pipe: Check for ring full inside of the
      spinlock in pipe_write()")
    - commit b667b867 ("pipe: Advance tail pointer inside of wait
      spinlock in pipe_read()")
    - commit 189b0ddc ("pipe: Fix missing lock in pipe_resize_ring()")
    Signed-off-by: default avatarMax Kellermann <max.kellermann@ionos.com>
    Message-Id: <20230921075755.1378787-4-max.kellermann@ionos.com>
    Reviewed-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    478dbf12
pipe.c 36.4 KB