lkml.org 
[lkml]   [2013]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 09/13] rwsem: skip initial trylock in rwsem_down_write_failed
    Date
    We can skip the initial trylock in rwsem_down_write_failed() if there are
    known active lockers already, thus saving one likely-to-fail cmpxchg.

    Signed-off-by: Michel Lespinasse <walken@google.com>

    ---
    lib/rwsem.c | 17 +++++++++--------
    1 file changed, 9 insertions(+), 8 deletions(-)

    diff --git a/lib/rwsem.c b/lib/rwsem.c
    index edf3d9ca670e..0d50e46d5b0c 100644
    --- a/lib/rwsem.c
    +++ b/lib/rwsem.c
    @@ -216,14 +216,15 @@ struct rw_semaphore __sched *rwsem_down_write_failed(struct rw_semaphore *sem)
    /* wait until we successfully acquire the lock */
    set_task_state(tsk, TASK_UNINTERRUPTIBLE);
    while (true) {
    -
    - /* Try acquiring the write lock. */
    - count = RWSEM_ACTIVE_WRITE_BIAS;
    - if (!list_is_singular(&sem->wait_list))
    - count += RWSEM_WAITING_BIAS;
    - if (cmpxchg(&sem->count, RWSEM_WAITING_BIAS, count) ==
    + if (!(count & RWSEM_ACTIVE_MASK)) {
    + /* Try acquiring the write lock. */
    + count = RWSEM_ACTIVE_WRITE_BIAS;
    + if (!list_is_singular(&sem->wait_list))
    + count += RWSEM_WAITING_BIAS;
    + if (cmpxchg(&sem->count, RWSEM_WAITING_BIAS, count) ==
    RWSEM_WAITING_BIAS)
    - break;
    + break;
    + }

    raw_spin_unlock_irq(&sem->wait_lock);

    @@ -231,7 +232,7 @@ struct rw_semaphore __sched *rwsem_down_write_failed(struct rw_semaphore *sem)
    do {
    schedule();
    set_task_state(tsk, TASK_UNINTERRUPTIBLE);
    - } while (sem->count & RWSEM_ACTIVE_MASK);
    + } while ((count = sem->count) & RWSEM_ACTIVE_MASK);

    raw_spin_lock_irq(&sem->wait_lock);
    }
    --
    1.8.1.3

    \
     
     \ /
      Last update: 2013-03-15 12:41    [W:4.333 / U:1.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site