Prev: linux-next: build failure after merge of the net tree
Next: [PATCH 08/12] rwsem: smaller wrappers around rwsem_down_failed_common
From: Michel Lespinasse on 11 May 2010 23:30 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(a)google.com> --- lib/rwsem.c | 22 +++++++++++++++++++++- 1 files changed, 21 insertions(+), 1 deletions(-) diff --git a/lib/rwsem.c b/lib/rwsem.c index 1702524..689d4a2 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 }; #define RWSEM_WAKE_ANY 0 /* Wake whatever's at head of wait list */ @@ -174,7 +175,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 read-locking */ count = rwsem_atomic_update(adjustment, sem); @@ -215,6 +220,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 writers + */ +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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |