diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index e41e4b4b5267bd177ec19860180ea0eee0496c86..43afef3cc96385e37b567b659ba7cf1f94ec1d13 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c @@ -280,8 +280,10 @@ __rwsem_down_read_failed_common(struct rw_semaphore *sem, int state) /* wait to be given the lock */ while (true) { set_current_state(state); - if (!waiter.task) + if (!smp_load_acquire(&waiter.task)) { + /* Matches rwsem_mark_wake()'s smp_store_release(). */ break; + } if (signal_pending_state(state, current)) { raw_spin_lock_irq(&sem->wait_lock); if (waiter.task)