Browse Source

workqueue: clear leftover flags when detached

When a worker is detached, the worker->flags may still have WORKER_UNBOUND
or WORKER_REBOUND, it is OK for all cases:
  1) if it is a normal worker, the worker will be dead, it is OK.
  2) if it is a rescuer, it may re-attach to a pool with this leftover flag[s],
     it is still correct except it may cause unneeded wakeup.

It is correct but not good, so we just remove the leftover flags.

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Lai Jiangshan 11 years ago
parent
commit
b62c075194
1 changed files with 3 additions and 0 deletions
  1. 3 0
      kernel/workqueue.c

+ 3 - 0
kernel/workqueue.c

@@ -1663,6 +1663,9 @@ static void worker_detach_from_pool(struct worker *worker,
 		detach_completion = pool->detach_completion;
 		detach_completion = pool->detach_completion;
 	mutex_unlock(&pool->attach_mutex);
 	mutex_unlock(&pool->attach_mutex);
 
 
+	/* clear leftover flags without pool->lock after it is detached */
+	worker->flags &= ~(WORKER_UNBOUND | WORKER_REBOUND);
+
 	if (detach_completion)
 	if (detach_completion)
 		complete(detach_completion);
 		complete(detach_completion);
 }
 }