Messages in this thread Patch in this message | | | From | Lai Jiangshan <> | Subject | [PATCH 01/12] workqueue: add WORKER_RESCUER | Date | Thu, 27 Sep 2012 01:20:32 +0800 |
| |
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 <laijs@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
| |