Messages in this thread | | | Date | Thu, 20 Feb 2014 09:50:39 +0800 | From | Lai Jiangshan <> | Subject | Re: [PATCH] workqueue: Fix possible unexpectedly worker wakeup before started |
| |
On 02/20/2014 08:11 AM, Tejun Heo wrote: > Hello, Lai. > > On Wed, Feb 19, 2014 at 11:47:58AM +0800, Lai Jiangshan wrote: >> If a worker is wokenup unexpectedly, it will start to work incorretly. >> Although it hardly happen, we should catch it and wait for being started >> if it does happen. > > Can this actually happen? If so, how?
I don't think it can happen. It depends on the system outside of workqueue.
I'm afraid someone see the task and wake up it. workqueue protect itself.
> >> Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> >> --- >> kernel/workqueue.c | 6 ++++++ >> 1 files changed, 6 insertions(+), 0 deletions(-) >> >> diff --git a/kernel/workqueue.c b/kernel/workqueue.c >> index 82ef9f3..bee5fe1 100644 >> --- a/kernel/workqueue.c >> +++ b/kernel/workqueue.c >> @@ -2284,6 +2284,12 @@ static int worker_thread(void *__worker) >> struct worker *worker = __worker; >> struct worker_pool *pool = worker->pool; >> >> + if (WARN_ON_ONCE(!(worker->flags & WORKER_STARTED))) { > > And if this is something which can legitimately happen, why are we > triggering WARN on it?
If it happens, it means there is something wrong in the system.
> >> + /* The worker is wokenup unexpectedly before started */ >> + mutex_lock(&pool->manager_mutex); >> + mutex_unlock(&pool->manager_mutex); > > And what does these mutex cycling achieve (they need comment)?
Synchronize the manager to finish.
> > Thanks. >
| |