• Michel Lespinasse's avatar
    rwsem: simplify rwsem_down_write_failed · 023fe4f7
    Michel Lespinasse authored
    When waking writers, we never grant them the lock - instead, they have
    to acquire it themselves when they run, and remove themselves from the
    wait_list when they succeed.
    
    As a result, we can do a few simplifications in rwsem_down_write_failed():
    
    - We don't need to check for !waiter.task since __rwsem_do_wake() doesn't
      remove writers from the wait_list
    
    - There is no point releaseing the wait_lock before entering the wait loop,
      as we will need to reacquire it immediately. We can change the loop so
      that the lock is always held at the start of each loop iteration.
    
    - We don't need to get a reference on the task structure, since the task
      is responsible for removing itself from the wait_list. There is no risk,
      like in the rwsem_down_read_failed() case, that a task would wake up and
      exit (thus destroying its task structure) while __rwsem_do_wake() is
      still running - wait_lock protects against that.
    Signed-off-by: default avatarMichel Lespinasse <walken@google.com>
    Reviewed-by: default avatarRik van Riel <riel@redhat.com>
    Reviewed-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Acked-by: default avatarDavidlohr Bueso <davidlohr.bueso@hp.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    023fe4f7
rwsem.c 8.73 KB