lkml.org 
[lkml]   [2010]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/10] rwsem: down_read_critical infrastructure support
    Date
    Add rwsem_down_read_unfair_failed() function in the non-generic rwsem
    library code, similar to rwsem_down_read_failed() except that blocked
    threads are placed at the head of the queue.

    Signed-off-by: Michel Lespinasse <walken@google.com>
    ---
    lib/rwsem.c | 22 +++++++++++++++++++++-
    1 files changed, 21 insertions(+), 1 deletions(-)

    diff --git a/lib/rwsem.c b/lib/rwsem.c
    index d8764e0..b3fe179 100644
    --- a/lib/rwsem.c
    +++ b/lib/rwsem.c
    @@ -34,6 +34,7 @@ struct rwsem_waiter {
    unsigned int flags;
    #define RWSEM_WAITING_FOR_READ 0x00000001
    #define RWSEM_WAITING_FOR_WRITE 0x00000002
    +#define RWSEM_UNFAIR 0x00000004
    };

    /* Wake types for __rwsem_do_wake(). Note that RWSEM_WAKE_NO_ACTIVE and
    @@ -187,7 +188,11 @@ rwsem_down_failed_common(struct rw_semaphore *sem,

    if (list_empty(&sem->wait_list))
    adjustment += RWSEM_WAITING_BIAS;
    - list_add_tail(&waiter.list, &sem->wait_list);
    +
    + if (flags & RWSEM_UNFAIR)
    + list_add(&waiter.list, &sem->wait_list);
    + else
    + list_add_tail(&waiter.list, &sem->wait_list);

    /* we're now waiting on the lock, but no longer actively locking */
    count = rwsem_atomic_update(adjustment, sem);
    @@ -229,6 +234,21 @@ rwsem_down_read_failed(struct rw_semaphore *sem)
    -RWSEM_ACTIVE_READ_BIAS);
    }

    +#ifdef __HAVE_DOWN_READ_UNFAIR
    +
    +/*
    + * wait for the read lock to be granted - skip waiting threads
    + */
    +asmregparm struct rw_semaphore __sched *
    +rwsem_down_read_unfair_failed(struct rw_semaphore *sem)
    +{
    + return rwsem_down_failed_common(sem,
    + RWSEM_WAITING_FOR_READ | RWSEM_UNFAIR,
    + -RWSEM_ACTIVE_READ_BIAS);
    +}
    +
    +#endif
    +
    /*
    * wait for the write lock to be granted
    */
    --
    1.7.0.1


    \
     
     \ /
      Last update: 2010-05-18 00:33    [W:0.030 / U:0.172 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site