All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] rwsem-spinlock: Fix EINTR branch in __down_write_common()
@ 2017-06-16 13:44 Kirill Tkhai
  2017-06-28 13:20 ` Niklas Cassel
  2017-07-05 14:27 ` [tip:locking/urgent] locking/rwsem-spinlock: " tip-bot for Kirill Tkhai
  0 siblings, 2 replies; 7+ messages in thread
From: Kirill Tkhai @ 2017-06-16 13:44 UTC (permalink / raw)
  To: peterz, linux-kernel, ktkhai, mingo, niklas.cassel

If a writer could been woken up, the above branch

	if (sem->count == 0)
		break;

would have moved us to taking the sem. So, it's
not the time to wake a writer now, and only readers
are allowed now. Thus, 0 must be passed to __rwsem_do_wake().

Next, __rwsem_do_wake() wakes readers unconditionally.
But we mustn't do that if the sem is owned by writer
in the moment. Otherwise, writer and reader own the sem
the same time, which leads to memory corruption in
callers.

rwsem-xadd.c does not need that, as:
1)the similar check is made lockless there,
2)in __rwsem_mark_wake::try_reader_grant we test,
that sem is not owned by writer.

Fixes: 17fcbd590d0c "locking/rwsem: Fix down_write_killable() for CONFIG_RWSEM_GENERIC_SPINLOCK=y"
Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
CC: Niklas Cassel <niklas.cassel@axis.com>
CC: Peter Zijlstra (Intel) <peterz@infradead.org>
CC: Ingo Molnar <mingo@kernel.org>
---
 kernel/locking/rwsem-spinlock.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/locking/rwsem-spinlock.c b/kernel/locking/rwsem-spinlock.c
index c65f7989f850..20819df98125 100644
--- a/kernel/locking/rwsem-spinlock.c
+++ b/kernel/locking/rwsem-spinlock.c
@@ -231,8 +231,8 @@ int __sched __down_write_common(struct rw_semaphore *sem, int state)
 
 out_nolock:
 	list_del(&waiter.list);
-	if (!list_empty(&sem->wait_list))
-		__rwsem_do_wake(sem, 1);
+	if (!list_empty(&sem->wait_list) && sem->count >= 0)
+		__rwsem_do_wake(sem, 0);
 	raw_spin_unlock_irqrestore(&sem->wait_lock, flags);
 
 	return -EINTR;

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-07-06  7:42 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-16 13:44 [PATCH] rwsem-spinlock: Fix EINTR branch in __down_write_common() Kirill Tkhai
2017-06-28 13:20 ` Niklas Cassel
2017-06-28 15:36   ` Kirill Tkhai
2017-07-05 14:27 ` [tip:locking/urgent] locking/rwsem-spinlock: " tip-bot for Kirill Tkhai
2017-07-05 14:45   ` Niklas Cassel
2017-07-06  7:28     ` Ingo Molnar
2017-07-06  7:42       ` Peter Zijlstra

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.