If the worker task is not idle, it may sleep on some conditions by the request
of the work. Our unfriendly wakeup in the insert_kthread_work() may confuse
the worker.
Signed-off-by: Lai Jiangshan <[email protected]>
---
kernel/kthread.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/kernel/kthread.c b/kernel/kthread.c
index c2390f4..ef48322 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -591,7 +591,7 @@ static void insert_kthread_work(struct kthread_worker *worker,
list_add_tail(&work->node, pos);
work->worker = worker;
- if (likely(worker->task))
+ if (!worker->current_work && likely(worker->task))
wake_up_process(worker->task);
}
--
1.7.4.4
On Sat, Jul 26, 2014 at 12:03:59PM +0800, Lai Jiangshan wrote:
> If the worker task is not idle, it may sleep on some conditions by the request
> of the work. Our unfriendly wakeup in the insert_kthread_work() may confuse
> the worker.
>
> Signed-off-by: Lai Jiangshan <[email protected]>
Applied to wq/for-3.17.
Thanks.
--
tejun