linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: tip-bot for Peter Zijlstra <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: jcmvbkbc@gmail.com, linux-kernel@vger.kernel.org,
	penguin-kernel@I-love.SAKURA.ne.jp, acme@redhat.com,
	Waiman.Long@hpe.com, eranian@google.com, mingo@kernel.org,
	tony.luck@intel.com, torvalds@linux-foundation.org,
	mhocko@kernel.org, tglx@linutronix.de, vincent.weaver@maine.edu,
	dave@stgolabs.net, jolsa@redhat.com, peterz@infradead.org,
	davem@davemloft.net, alexander.shishkin@linux.intel.com,
	hpa@zytor.com, chris@zankel.net, akpm@linux-foundation.org
Subject: [tip:locking/rwsem] locking/rwsem: Fix down_write_killable()
Date: Sun, 15 May 2016 13:57:40 -0700	[thread overview]
Message-ID: <tip-04cafed7fc19a8010771c788708ac97c405fc3de@git.kernel.org> (raw)
In-Reply-To: <20160512115745.GP3192@twins.programming.kicks-ass.net>

Commit-ID:  04cafed7fc19a8010771c788708ac97c405fc3de
Gitweb:     http://git.kernel.org/tip/04cafed7fc19a8010771c788708ac97c405fc3de
Author:     Peter Zijlstra <peterz@infradead.org>
AuthorDate: Thu, 12 May 2016 13:57:45 +0200
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Sun, 15 May 2016 22:55:00 +0200

locking/rwsem: Fix down_write_killable()

The new signal_pending exit path in __rwsem_down_write_failed_common()
was fingered as breaking his kernel by Tetsuo Handa.

Upon inspection it was found that there are two things wrong with it;

 - it forgets to remove WAITING_BIAS if it leaves the list empty, or
 - it forgets to wake further waiters that were blocked on the now
   removed waiter.

Especially the first issue causes new lock attempts to block and stall
indefinitely, as the code assumes that pending waiters mean there is
an owner that will wake when it releases the lock.

Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Tested-by: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Chris Zankel <chris@zankel.net>
Cc: David S. Miller <davem@davemloft.net>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: Waiman Long <Waiman.Long@hpe.com>
Link: http://lkml.kernel.org/r/20160512115745.GP3192@twins.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 kernel/locking/rwsem-xadd.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c
index df4dcb8..09e30c6 100644
--- a/kernel/locking/rwsem-xadd.c
+++ b/kernel/locking/rwsem-xadd.c
@@ -487,23 +487,32 @@ __rwsem_down_write_failed_common(struct rw_semaphore *sem, int state)
 
 		/* Block until there are no active lockers. */
 		do {
-			if (signal_pending_state(state, current)) {
-				raw_spin_lock_irq(&sem->wait_lock);
-				ret = ERR_PTR(-EINTR);
-				goto out;
-			}
+			if (signal_pending_state(state, current))
+				goto out_nolock;
+
 			schedule();
 			set_current_state(state);
 		} while ((count = sem->count) & RWSEM_ACTIVE_MASK);
 
 		raw_spin_lock_irq(&sem->wait_lock);
 	}
-out:
 	__set_current_state(TASK_RUNNING);
 	list_del(&waiter.list);
 	raw_spin_unlock_irq(&sem->wait_lock);
 
 	return ret;
+
+out_nolock:
+	__set_current_state(TASK_RUNNING);
+	raw_spin_lock_irq(&sem->wait_lock);
+	list_del(&waiter.list);
+	if (list_empty(&sem->wait_list))
+		rwsem_atomic_update(-RWSEM_WAITING_BIAS, sem);
+	else
+		__rwsem_do_wake(sem, RWSEM_WAKE_ANY);
+	raw_spin_unlock_irq(&sem->wait_lock);
+
+	return ERR_PTR(-EINTR);
 }
 
 __visible struct rw_semaphore * __sched

  parent reply	other threads:[~2016-05-15 20:59 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-01 11:04 [PATCH 0/11] introduce down_write_killable for rw_semaphore v2 Michal Hocko
2016-04-01 11:04 ` [PATCH 01/11] locking, rwsem: get rid of __down_write_nested Michal Hocko
2016-04-02  0:28   ` Davidlohr Bueso
2016-04-01 11:04 ` [PATCH 02/11] locking, rwsem: drop explicit memory barriers Michal Hocko
2016-04-02  1:17   ` Davidlohr Bueso
2016-04-04  9:03     ` Michal Hocko
2016-04-04  9:06       ` [PATCH 1/2] xtensa, rwsem: drop superfluous arch specific implementation Michal Hocko
2016-04-04  9:06         ` [PATCH 2/2] sh, " Michal Hocko
2016-04-06  9:26           ` Peter Zijlstra
2016-04-06  9:50             ` Geert Uytterhoeven
2016-04-06 10:27               ` Peter Zijlstra
2016-04-04 10:23         ` [PATCH 1/2] xtensa, " Max Filippov
2016-04-06  9:06     ` [PATCH] sparc, " Michal Hocko
2016-04-01 11:04 ` [PATCH 03/11] locking, rwsem: introduce basis for down_write_killable Michal Hocko
2016-04-02  4:41   ` Davidlohr Bueso
2016-04-04  9:17     ` Michal Hocko
2016-04-04  9:21       ` Peter Zijlstra
2016-04-07  6:58       ` Davidlohr Bueso
2016-04-07  7:38         ` Michal Hocko
2016-05-10 10:43   ` Tetsuo Handa
2016-05-10 11:53     ` Michal Hocko
2016-05-10 12:38       ` Peter Zijlstra
2016-05-10 13:57         ` Tetsuo Handa
2016-05-11  7:23         ` Michal Hocko
2016-05-11  8:28           ` Michal Hocko
2016-05-11  8:44             ` Peter Zijlstra
2016-05-11  9:04               ` Michal Hocko
2016-05-11  9:17                 ` Peter Zijlstra
2016-05-11  9:31                   ` Michal Hocko
2016-05-11  9:41                     ` Peter Zijlstra
2016-05-11 13:59                       ` Michal Hocko
2016-05-11 18:03                         ` Michal Hocko
2016-05-12 11:57                           ` [PATCH] locking, rwsem: Fix down_write_killable() Peter Zijlstra
2016-05-12 12:15                             ` [tip:locking/rwsem] locking/rwsem: " tip-bot for Peter Zijlstra
2016-05-12 16:59                             ` [PATCH] locking, rwsem: " Michal Hocko
2016-05-15 20:57                             ` tip-bot for Peter Zijlstra [this message]
2016-05-12 12:12                           ` [PATCH 03/11] locking, rwsem: introduce basis for down_write_killable Peter Zijlstra
2016-05-12 12:19                             ` Michal Hocko
2016-05-12 13:58                               ` Peter Zijlstra
2016-05-12 19:42                               ` Waiman Long
2016-05-11  8:35           ` Peter Zijlstra
2016-05-11  9:02             ` Michal Hocko
2016-04-01 11:04 ` [PATCH 04/11] alpha, rwsem: provide __down_write_killable Michal Hocko
2016-04-01 11:04 ` [PATCH 05/11] ia64, " Michal Hocko
2016-04-01 11:04 ` [PATCH 06/11] s390, " Michal Hocko
2016-04-01 11:04 ` [PATCH 07/11] sh, " Michal Hocko
2016-04-01 11:04 ` [PATCH 08/11] sparc, " Michal Hocko
2016-04-01 11:04 ` [PATCH 09/11] xtensa, " Michal Hocko
2016-04-01 11:04 ` [PATCH 10/11] x86, " Michal Hocko
2016-04-06 18:31   ` Peter Zijlstra
2016-04-01 11:04 ` [PATCH 11/11] locking, rwsem: provide down_write_killable Michal Hocko

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=tip-04cafed7fc19a8010771c788708ac97c405fc3de@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=Waiman.Long@hpe.com \
    --cc=acme@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=chris@zankel.net \
    --cc=dave@stgolabs.net \
    --cc=davem@davemloft.net \
    --cc=eranian@google.com \
    --cc=hpa@zytor.com \
    --cc=jcmvbkbc@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mhocko@kernel.org \
    --cc=mingo@kernel.org \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=torvalds@linux-foundation.org \
    --cc=vincent.weaver@maine.edu \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).