* [PATCH] locking/rwsem: Reinit wake_q after use
@ 2017-01-22 2:33 Waiman Long
2017-01-22 10:14 ` [tip:locking/core] " tip-bot for Waiman Long
0 siblings, 1 reply; 5+ messages in thread
From: Waiman Long @ 2017-01-22 2:33 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra; +Cc: linux-kernel, Davidlohr Bueso, Waiman Long
In __rwsem_down_write_failed_common(), the same wake_q variable name
is defined twice, with the inner wake_q hiding the one in outer scope.
We can either use different names for the two wake_q's. Even better,
we can use the same wake_q twice, if necessary. To enable the latter
change, we need to define a new helper function wake_q_init() to
enable reinitalization of wake_q after use.
Signed-off-by: Waiman Long <longman@redhat.com>
---
include/linux/sched.h | 6 ++++++
kernel/locking/rwsem-xadd.c | 7 +++++--
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 8a9bbb6..3640bde 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1019,6 +1019,12 @@ struct wake_q_head {
#define DEFINE_WAKE_Q(name) \
struct wake_q_head name = { WAKE_Q_TAIL, &name.first }
+static inline void wake_q_init(struct wake_q_head *head)
+{
+ head->first = WAKE_Q_TAIL;
+ head->lastp = &head->first;
+}
+
extern void wake_q_add(struct wake_q_head *head,
struct task_struct *task);
extern void wake_up_q(struct wake_q_head *head);
diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c
index a3a381a..2ad8d8d 100644
--- a/kernel/locking/rwsem-xadd.c
+++ b/kernel/locking/rwsem-xadd.c
@@ -502,8 +502,6 @@ static inline bool rwsem_has_spinner(struct rw_semaphore *sem)
* wake any read locks that were queued ahead of us.
*/
if (count > RWSEM_WAITING_BIAS) {
- DEFINE_WAKE_Q(wake_q);
-
__rwsem_mark_wake(sem, RWSEM_WAKE_READERS, &wake_q);
/*
* The wakeup is normally called _after_ the wait_lock
@@ -513,6 +511,11 @@ static inline bool rwsem_has_spinner(struct rw_semaphore *sem)
* for attempting rwsem_try_write_lock().
*/
wake_up_q(&wake_q);
+
+ /*
+ * Reinitialize wake_q after use.
+ */
+ wake_q_init(&wake_q);
}
} else
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [tip:locking/core] locking/rwsem: Reinit wake_q after use
2017-01-22 2:33 [PATCH] locking/rwsem: Reinit wake_q after use Waiman Long
@ 2017-01-22 10:14 ` tip-bot for Waiman Long
2017-01-29 15:15 ` [PATCH -tip] sched/wake_q: Clarify queue reinit Davidlohr Bueso
0 siblings, 1 reply; 5+ messages in thread
From: tip-bot for Waiman Long @ 2017-01-22 10:14 UTC (permalink / raw)
To: linux-tip-commits
Cc: akpm, linux-kernel, tglx, paulmck, hpa, dave, torvalds, peterz,
mingo, longman
Commit-ID: bcc9a76d5ac426bc45c9e863b1830347827ca77a
Gitweb: http://git.kernel.org/tip/bcc9a76d5ac426bc45c9e863b1830347827ca77a
Author: Waiman Long <longman@redhat.com>
AuthorDate: Sat, 21 Jan 2017 21:33:35 -0500
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Sun, 22 Jan 2017 09:54:00 +0100
locking/rwsem: Reinit wake_q after use
In __rwsem_down_write_failed_common(), the same wake_q variable name
is defined twice, with the inner wake_q hiding the one in outer scope.
We can either use different names for the two wake_q's.
Even better, we can use the same wake_q twice, if necessary.
To enable the latter change, we need to define a new helper function
wake_q_init() to enable reinitalization of wake_q after use.
Signed-off-by: Waiman Long <longman@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1485052415-9611-1-git-send-email-longman@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
include/linux/sched.h | 6 ++++++
kernel/locking/rwsem-xadd.c | 7 +++++--
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index f4f9d32..4e62b37 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1021,6 +1021,12 @@ struct wake_q_head {
#define DEFINE_WAKE_Q(name) \
struct wake_q_head name = { WAKE_Q_TAIL, &name.first }
+static inline void wake_q_init(struct wake_q_head *head)
+{
+ head->first = WAKE_Q_TAIL;
+ head->lastp = &head->first;
+}
+
extern void wake_q_add(struct wake_q_head *head,
struct task_struct *task);
extern void wake_up_q(struct wake_q_head *head);
diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c
index a3a381a..2ad8d8d 100644
--- a/kernel/locking/rwsem-xadd.c
+++ b/kernel/locking/rwsem-xadd.c
@@ -502,8 +502,6 @@ __rwsem_down_write_failed_common(struct rw_semaphore *sem, int state)
* wake any read locks that were queued ahead of us.
*/
if (count > RWSEM_WAITING_BIAS) {
- DEFINE_WAKE_Q(wake_q);
-
__rwsem_mark_wake(sem, RWSEM_WAKE_READERS, &wake_q);
/*
* The wakeup is normally called _after_ the wait_lock
@@ -513,6 +511,11 @@ __rwsem_down_write_failed_common(struct rw_semaphore *sem, int state)
* for attempting rwsem_try_write_lock().
*/
wake_up_q(&wake_q);
+
+ /*
+ * Reinitialize wake_q after use.
+ */
+ wake_q_init(&wake_q);
}
} else
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH -tip] sched/wake_q: Clarify queue reinit
2017-01-22 10:14 ` [tip:locking/core] " tip-bot for Waiman Long
@ 2017-01-29 15:15 ` Davidlohr Bueso
2017-01-29 16:22 ` Waiman Long
2017-02-01 10:08 ` [tip:locking/core] sched/wake_q: Clarify queue reinit comment tip-bot for Davidlohr Bueso
0 siblings, 2 replies; 5+ messages in thread
From: Davidlohr Bueso @ 2017-01-29 15:15 UTC (permalink / raw)
To: hpa, akpm, linux-kernel, tglx, paulmck, longman, mingo, peterz,
torvalds
Cc: linux-tip-commits
As of bcc9a76d5ac (locking/rwsem: Reinit wake_q after use), the
comment regarding the list reinitialization no longer applies,
update it with the new wake_q_init() helper.
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
---
include/linux/sched.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 3640bde9f982..c0bc626c531f 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -998,8 +998,8 @@ enum cpu_idle_type {
*
* The DEFINE_WAKE_Q macro declares and initializes the list head.
* wake_up_q() does NOT reinitialize the list; it's expected to be
- * called near the end of a function, where the fact that the queue is
- * not used again will be easy to see by inspection.
+ * called near the end of a function. Otherwise, the list can be
+ * re-initialized for later re-use by wake_q_init().
*
* Note that this can cause spurious wakeups. schedule() callers
* must ensure the call is done inside a loop, confirming that the
--
2.6.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH -tip] sched/wake_q: Clarify queue reinit
2017-01-29 15:15 ` [PATCH -tip] sched/wake_q: Clarify queue reinit Davidlohr Bueso
@ 2017-01-29 16:22 ` Waiman Long
2017-02-01 10:08 ` [tip:locking/core] sched/wake_q: Clarify queue reinit comment tip-bot for Davidlohr Bueso
1 sibling, 0 replies; 5+ messages in thread
From: Waiman Long @ 2017-01-29 16:22 UTC (permalink / raw)
To: Davidlohr Bueso, hpa, akpm, linux-kernel, tglx, paulmck, mingo,
peterz, torvalds
Cc: linux-tip-commits
On 01/29/2017 10:15 AM, Davidlohr Bueso wrote:
> As of bcc9a76d5ac (locking/rwsem: Reinit wake_q after use), the
> comment regarding the list reinitialization no longer applies,
> update it with the new wake_q_init() helper.
>
> Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
> ---
> include/linux/sched.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 3640bde9f982..c0bc626c531f 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -998,8 +998,8 @@ enum cpu_idle_type {
> *
> * The DEFINE_WAKE_Q macro declares and initializes the list head.
> * wake_up_q() does NOT reinitialize the list; it's expected to be
> - * called near the end of a function, where the fact that the queue is
> - * not used again will be easy to see by inspection.
> + * called near the end of a function. Otherwise, the list can be
> + * re-initialized for later re-use by wake_q_init().
> *
> * Note that this can cause spurious wakeups. schedule() callers
> * must ensure the call is done inside a loop, confirming that the
Acked-by: Waiman Long <longman@redhat.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [tip:locking/core] sched/wake_q: Clarify queue reinit comment
2017-01-29 15:15 ` [PATCH -tip] sched/wake_q: Clarify queue reinit Davidlohr Bueso
2017-01-29 16:22 ` Waiman Long
@ 2017-02-01 10:08 ` tip-bot for Davidlohr Bueso
1 sibling, 0 replies; 5+ messages in thread
From: tip-bot for Davidlohr Bueso @ 2017-02-01 10:08 UTC (permalink / raw)
To: linux-tip-commits; +Cc: dave, hpa, dbueso, linux-kernel, mingo, longman, tglx
Commit-ID: 0754445d71c37a7afd4f0790a9be4cf53c1b8cc4
Gitweb: http://git.kernel.org/tip/0754445d71c37a7afd4f0790a9be4cf53c1b8cc4
Author: Davidlohr Bueso <dave@stgolabs.net>
AuthorDate: Sun, 29 Jan 2017 07:15:31 -0800
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 1 Feb 2017 10:02:18 +0100
sched/wake_q: Clarify queue reinit comment
As of:
bcc9a76d5ac ("locking/rwsem: Reinit wake_q after use")
the comment regarding the list reinitialization no longer applies,
update it with the new wake_q_init() helper.
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
Acked-by: Waiman Long <longman@redhat.com>
Cc: peterz@infradead.org
Cc: longman@redhat.com
Cc: akpm@linux-foundation.org
Cc: paulmck@linux.vnet.ibm.com
Cc: torvalds@linux-foundation.org
Link: http://lkml.kernel.org/r/20170129151531.GA2444@linux-80c1.suse
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
include/linux/sched.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 4e62b37..1cc0ded 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1000,8 +1000,8 @@ enum cpu_idle_type {
*
* The DEFINE_WAKE_Q macro declares and initializes the list head.
* wake_up_q() does NOT reinitialize the list; it's expected to be
- * called near the end of a function, where the fact that the queue is
- * not used again will be easy to see by inspection.
+ * called near the end of a function. Otherwise, the list can be
+ * re-initialized for later re-use by wake_q_init().
*
* Note that this can cause spurious wakeups. schedule() callers
* must ensure the call is done inside a loop, confirming that the
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-02-01 10:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-22 2:33 [PATCH] locking/rwsem: Reinit wake_q after use Waiman Long
2017-01-22 10:14 ` [tip:locking/core] " tip-bot for Waiman Long
2017-01-29 15:15 ` [PATCH -tip] sched/wake_q: Clarify queue reinit Davidlohr Bueso
2017-01-29 16:22 ` Waiman Long
2017-02-01 10:08 ` [tip:locking/core] sched/wake_q: Clarify queue reinit comment tip-bot for Davidlohr Bueso
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.