diff options
author | Tejun Heo <tj@kernel.org> | 2013-02-14 04:29:07 +0100 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-02-14 04:29:07 +0100 |
commit | 1dd638149f1f9d7d7dbb32591d5c7c2a0ea36264 (patch) | |
tree | 454399689b5d5016eefbd9f12e39b2674a8ebb33 /kernel/workqueue.c | |
parent | workqueue: pick cwq instead of pool in __queue_work() (diff) | |
download | linux-1dd638149f1f9d7d7dbb32591d5c7c2a0ea36264.tar.xz linux-1dd638149f1f9d7d7dbb32591d5c7c2a0ea36264.zip |
workqueue: fix is_chained_work() regression
c9e7cf273f ("workqueue: move busy_hash from global_cwq to
worker_pool") incorrectly converted is_chained_work() to use
get_gcwq() inside for_each_gcwq_cpu() while removing get_gcwq().
As cwq might not exist for all possible workqueue CPUs, @cwq can be
NULL and the following cwq deferences can lead to oops.
Fix it by using for_each_cwq_cpu() instead, which is the better one to
use anyway as we only need to check pools that the wq is associated
with.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index d6fdce12ca7e..0d26ab3aee59 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1167,7 +1167,7 @@ static bool is_chained_work(struct workqueue_struct *wq) unsigned long flags; unsigned int cpu; - for_each_wq_cpu(cpu) { + for_each_cwq_cpu(cpu, wq) { struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq); struct worker_pool *pool = cwq->pool; struct worker *worker; |