rescuer thread must be a worker which is WORKER_NOT_RUNNING: If it is *not* WORKER_NOT_RUNNING, it will increase the nr_running and it disables the normal workers wrongly.
So rescuer thread must be WORKER_NOT_RUNNING. Currently code implement it by always setting WORKER_PREP on rescuer thread, but this kind of implement is ugly: A) It reuses WORKER_PREP which is used for a different meaning. B) It does not told us rescuer thread is WORKER_NOT_RUNNING. So we add WORKER_RESCUER to fix these two sematic. Signed-off-by: Lai Jiangshan <la...@cn.fujitsu.com> --- kernel/workqueue.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 737ab01..ec882a6 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -73,11 +73,12 @@ enum { WORKER_DIE = 1 << 1, /* die die die */ WORKER_IDLE = 1 << 2, /* is idle */ WORKER_PREP = 1 << 3, /* preparing to run works */ + WORKER_RESCUER = 1 << 4, /* rescuer thread */ WORKER_CPU_INTENSIVE = 1 << 6, /* cpu intensive */ WORKER_UNBOUND = 1 << 7, /* worker is unbound */ WORKER_NOT_RUNNING = WORKER_PREP | WORKER_UNBOUND | - WORKER_CPU_INTENSIVE, + WORKER_RESCUER | WORKER_CPU_INTENSIVE, NR_WORKER_POOLS = 2, /* # worker pools per gcwq */ @@ -2405,6 +2406,7 @@ static int rescuer_thread(void *__wq) bool is_unbound = wq->flags & WQ_UNBOUND; unsigned int cpu; + rescuer->flags |= WORKER_RESCUER; set_user_nice(current, RESCUER_NICE_LEVEL); repeat: set_current_state(TASK_INTERRUPTIBLE); -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/