* [PATCH] irq_work: Don't reinvent the wheel but use existing llist API
@ 2017-10-31 1:46 Frederic Weisbecker
2017-10-31 12:04 ` [tip:irq/core] irq/work: " tip-bot for Byungchul Park
2017-11-10 0:17 ` [PATCH] irq_work: " Chris Wilson
0 siblings, 2 replies; 4+ messages in thread
From: Frederic Weisbecker @ 2017-10-31 1:46 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, Byungchul Park, Frederic Weisbecker, Peter Zijlstra
From: Byungchul Park <byungchul.park@lge.com>
Although llist provides proper APIs, they are not used. Make them used.
Signed-off-by: Byungchul Park <byungchul.park@lge.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
kernel/irq_work.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/kernel/irq_work.c b/kernel/irq_work.c
index bcf107c..e2ebe8c 100644
--- a/kernel/irq_work.c
+++ b/kernel/irq_work.c
@@ -138,11 +138,7 @@ static void irq_work_run_list(struct llist_head *list)
return;
llnode = llist_del_all(list);
- while (llnode != NULL) {
- work = llist_entry(llnode, struct irq_work, llnode);
-
- llnode = llist_next(llnode);
-
+ llist_for_each_entry(work, llnode, llnode) {
/*
* Clear the PENDING bit, after this point the @work
* can be re-used.
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* [tip:irq/core] irq/work: Don't reinvent the wheel but use existing llist API
2017-10-31 1:46 [PATCH] irq_work: Don't reinvent the wheel but use existing llist API Frederic Weisbecker
@ 2017-10-31 12:04 ` tip-bot for Byungchul Park
2017-11-10 0:17 ` [PATCH] irq_work: " Chris Wilson
1 sibling, 0 replies; 4+ messages in thread
From: tip-bot for Byungchul Park @ 2017-10-31 12:04 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, frederic, byungchul.park, peterz, tglx, mingo, hpa,
torvalds
Commit-ID: 16c0890dc66d258fdeccf7b15a133f3930b19143
Gitweb: https://git.kernel.org/tip/16c0890dc66d258fdeccf7b15a133f3930b19143
Author: Byungchul Park <byungchul.park@lge.com>
AuthorDate: Tue, 31 Oct 2017 02:46:54 +0100
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 31 Oct 2017 10:24:39 +0100
irq/work: Don't reinvent the wheel but use existing llist API
Use the proper llist APIs instead of open-coded variants of them.
Signed-off-by: Byungchul Park <byungchul.park@lge.com>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1509414414-14987-1-git-send-email-frederic@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/irq_work.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/kernel/irq_work.c b/kernel/irq_work.c
index bcf107c..e2ebe8c 100644
--- a/kernel/irq_work.c
+++ b/kernel/irq_work.c
@@ -138,11 +138,7 @@ static void irq_work_run_list(struct llist_head *list)
return;
llnode = llist_del_all(list);
- while (llnode != NULL) {
- work = llist_entry(llnode, struct irq_work, llnode);
-
- llnode = llist_next(llnode);
-
+ llist_for_each_entry(work, llnode, llnode) {
/*
* Clear the PENDING bit, after this point the @work
* can be re-used.
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] irq_work: Don't reinvent the wheel but use existing llist API
2017-10-31 1:46 [PATCH] irq_work: Don't reinvent the wheel but use existing llist API Frederic Weisbecker
2017-10-31 12:04 ` [tip:irq/core] irq/work: " tip-bot for Byungchul Park
@ 2017-11-10 0:17 ` Chris Wilson
2017-11-12 12:24 ` [tip:irq/core] irq/work: Use llist_for_each_entry_safe tip-bot for Thomas Gleixner
1 sibling, 1 reply; 4+ messages in thread
From: Chris Wilson @ 2017-11-10 0:17 UTC (permalink / raw)
To: Frederic Weisbecker, Ingo Molnar
Cc: LKML, Byungchul Park, Frederic Weisbecker, Peter Zijlstra,
Petri Latvala
Quoting Frederic Weisbecker (2017-10-31 01:46:54)
> From: Byungchul Park <byungchul.park@lge.com>
>
> Although llist provides proper APIs, they are not used. Make them used.
>
> Signed-off-by: Byungchul Park <byungchul.park@lge.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
> ---
> kernel/irq_work.c | 6 +-----
> 1 file changed, 1 insertion(+), 5 deletions(-)
>
> diff --git a/kernel/irq_work.c b/kernel/irq_work.c
> index bcf107c..e2ebe8c 100644
> --- a/kernel/irq_work.c
> +++ b/kernel/irq_work.c
> @@ -138,11 +138,7 @@ static void irq_work_run_list(struct llist_head *list)
> return;
>
> llnode = llist_del_all(list);
> - while (llnode != NULL) {
> - work = llist_entry(llnode, struct irq_work, llnode);
> -
> - llnode = llist_next(llnode);
> -
> + llist_for_each_entry(work, llnode, llnode) {
> /*
> * Clear the PENDING bit, after this point the @work
> * can be re-used.
I haven't seen this reported yet, but this requires
llist_for_each_entry_safe() because as mentioned work can be linked into
another cpu's runlist after the PENDING bit is cleared.
-Chris
^ permalink raw reply [flat|nested] 4+ messages in thread* [tip:irq/core] irq/work: Use llist_for_each_entry_safe
2017-11-10 0:17 ` [PATCH] irq_work: " Chris Wilson
@ 2017-11-12 12:24 ` tip-bot for Thomas Gleixner
0 siblings, 0 replies; 4+ messages in thread
From: tip-bot for Thomas Gleixner @ 2017-11-12 12:24 UTC (permalink / raw)
To: linux-tip-commits
Cc: hpa, petri.latvala, linux-kernel, byungchul.park, tglx, frederic,
peterz, mingo
Commit-ID: d00a08cf9ee986ad6689ce8c6fd176aff679c106
Gitweb: https://git.kernel.org/tip/d00a08cf9ee986ad6689ce8c6fd176aff679c106
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Sun, 12 Nov 2017 13:02:51 +0100
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Sun, 12 Nov 2017 13:15:14 +0100
irq/work: Use llist_for_each_entry_safe
The llist_for_each_entry() loop in irq_work_run_list() is unsafe because
once the works PENDING bit is cleared it can be requeued on another CPU.
Use llist_for_each_entry_safe() instead.
Fixes: 16c0890dc66d ("irq/work: Don't reinvent the wheel but use existing llist API")
Reported-by:Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Frederic Weisbecker <frederic@kernel.org>
Cc: Byungchul Park <byungchul.park@lge.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Petri Latvala <petri.latvala@intel.com>
Link: http://lkml.kernel.org/r/151027307351.14762.4611888896020658384@mail.alporthouse.com
---
kernel/irq_work.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/irq_work.c b/kernel/irq_work.c
index e2ebe8c..6647b33f 100644
--- a/kernel/irq_work.c
+++ b/kernel/irq_work.c
@@ -128,9 +128,9 @@ bool irq_work_needs_cpu(void)
static void irq_work_run_list(struct llist_head *list)
{
- unsigned long flags;
- struct irq_work *work;
+ struct irq_work *work, *tmp;
struct llist_node *llnode;
+ unsigned long flags;
BUG_ON(!irqs_disabled());
@@ -138,7 +138,7 @@ static void irq_work_run_list(struct llist_head *list)
return;
llnode = llist_del_all(list);
- llist_for_each_entry(work, llnode, llnode) {
+ llist_for_each_entry_safe(work, tmp, llnode, llnode) {
/*
* Clear the PENDING bit, after this point the @work
* can be re-used.
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-11-12 12:27 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-31 1:46 [PATCH] irq_work: Don't reinvent the wheel but use existing llist API Frederic Weisbecker
2017-10-31 12:04 ` [tip:irq/core] irq/work: " tip-bot for Byungchul Park
2017-11-10 0:17 ` [PATCH] irq_work: " Chris Wilson
2017-11-12 12:24 ` [tip:irq/core] irq/work: Use llist_for_each_entry_safe tip-bot for Thomas Gleixner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox