Prev: 2% loan offer
Next: [PATCH 10/10] Use down_read_unfair() for /sys/<pid>/exe and /sys/<pid>/maps files
From: Michel Lespinasse on 14 May 2010 08:50 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 2dd1a1b..f0589b2 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 @@ -186,7 +187,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); @@ -228,6 +233,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 -- 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/ |