| From 77f300b198f93328c26191b52655ce1b62e202cf Mon Sep 17 00:00:00 2001 |
| From: Daeseok Youn <daeseok.youn@gmail.com> |
| Date: Wed, 16 Apr 2014 14:32:29 +0900 |
| Subject: workqueue: fix bugs in wq_update_unbound_numa() failure path |
| |
| From: Daeseok Youn <daeseok.youn@gmail.com> |
| |
| commit 77f300b198f93328c26191b52655ce1b62e202cf upstream. |
| |
| wq_update_unbound_numa() failure path has the following two bugs. |
| |
| - alloc_unbound_pwq() is called without holding wq->mutex; however, if |
| the allocation fails, it jumps to out_unlock which tries to unlock |
| wq->mutex. |
| |
| - The function should switch to dfl_pwq on failure but didn't do so |
| after alloc_unbound_pwq() failure. |
| |
| Fix it by regrabbing wq->mutex and jumping to use_dfl_pwq on |
| alloc_unbound_pwq() failure. |
| |
| Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com> |
| Acked-by: Lai Jiangshan <laijs@cn.fujitsu.com> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Fixes: 4c16bd327c74 ("workqueue: implement NUMA affinity for unbound workqueues") |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/workqueue.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/workqueue.c |
| +++ b/kernel/workqueue.c |
| @@ -4043,7 +4043,8 @@ static void wq_update_unbound_numa(struc |
| if (!pwq) { |
| pr_warning("workqueue: allocation failed while updating NUMA affinity of \"%s\"\n", |
| wq->name); |
| - goto out_unlock; |
| + mutex_lock(&wq->mutex); |
| + goto use_dfl_pwq; |
| } |
| |
| /* |