All of lore.kernel.org
 help / color / mirror / Atom feed
From: Niklas Cassel <niklas.cassel@axis.com>
To: Kirill Tkhai <ktkhai@virtuozzo.com>, <peterz@infradead.org>,
	<linux-kernel@vger.kernel.org>, <mingo@kernel.org>
Subject: Re: [PATCH] rwsem-spinlock: Fix EINTR branch in __down_write_common()
Date: Wed, 28 Jun 2017 15:20:20 +0200	[thread overview]
Message-ID: <76aba539-a6c7-66e8-2088-d0f5938535dc@axis.com> (raw)
In-Reply-To: <149762063282.19811.9129615532201147826.stgit@localhost.localdomain>

Good catch!

This should go to -stable as well.


Perhaps

if (!list_empty(&sem->wait_list) && sem->count > 0)
	__rwsem_do_wake(sem, 0);

Rather than

if (!list_empty(&sem->wait_list) && sem->count >= 0)
	__rwsem_do_wake(sem, 0);

Since we have the spinlock, and since we just checked
if sem->count == 0, we still know that it can't be 0.

Either way:

Acked-by: Niklas Cassel <niklas.cassel@axis.com>

On 06/16/2017 03:44 PM, Kirill Tkhai wrote:
> 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;
> 

  reply	other threads:[~2017-06-28 13:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-16 13:44 [PATCH] rwsem-spinlock: Fix EINTR branch in __down_write_common() Kirill Tkhai
2017-06-28 13:20 ` Niklas Cassel [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=76aba539-a6c7-66e8-2088-d0f5938535dc@axis.com \
    --to=niklas.cassel@axis.com \
    --cc=ktkhai@virtuozzo.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.