diff options
Diffstat (limited to 'lib/rwsem.c')
| -rw-r--r-- | lib/rwsem.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/rwsem.c b/lib/rwsem.c index bbe48c04f36..61f91ca75e4 100644 --- a/lib/rwsem.c +++ b/lib/rwsem.c @@ -163,8 +163,14 @@ struct rw_semaphore __sched *rwsem_down_read_failed(struct rw_semaphore *sem)  	/* we're now waiting on the lock, but no longer actively locking */  	count = rwsem_atomic_update(adjustment, sem); -	/* If there are no active locks, wake the front queued process(es). */ -	if (!(count & RWSEM_ACTIVE_MASK)) +	/* If there are no active locks, wake the front queued process(es). +	 * +	 * If there are no writers and we are first in the queue, +	 * wake our own waiter to join the existing active readers ! +	 */ +	if (count == RWSEM_WAITING_BIAS || +	    (count > RWSEM_WAITING_BIAS && +	     adjustment != -RWSEM_ACTIVE_READ_BIAS))  		sem = __rwsem_do_wake(sem, RWSEM_WAKE_ANY);  	raw_spin_unlock_irq(&sem->wait_lock);  |