[PATCH] fix TASK_STOPPED vs TASK_NONINTERACTIVE interaction

do_signal_stop:

for_each_thread(t) {
if (t->state < TASK_STOPPED)
++sig->group_stop_count;
}

However, TASK_NONINTERACTIVE > TASK_STOPPED, so this loop will not
count TASK_INTERRUPTIBLE | TASK_NONINTERACTIVE threads.

See also wait_task_stopped(), which checks ->state > TASK_STOPPED.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>

[ We really probably should always use the appropriate bitmasks to test
task states, not do it like this. Using something like

#define TASK_RUNNABLE (TASK_RUNNING | TASK_INTERRUPTIBLE | \
TASK_UNINTERRUPTIBLE | TASK_NONINTERACTIVE)

and then doing "if (task->state & TASK_RUNNABLE)" or similar. But the
ordering of the task states is historical, and keeping the ordering
does make sense regardless. ]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Oleg Nesterov and committed by Linus Torvalds aa55a086 b20fd650

+5 -5
+5 -5
include/linux/sched.h
··· 110 #define TASK_RUNNING 0 111 #define TASK_INTERRUPTIBLE 1 112 #define TASK_UNINTERRUPTIBLE 2 113 - #define TASK_STOPPED 4 114 - #define TASK_TRACED 8 115 - #define EXIT_ZOMBIE 16 116 - #define EXIT_DEAD 32 117 - #define TASK_NONINTERACTIVE 64 118 119 #define __set_task_state(tsk, state_value) \ 120 do { (tsk)->state = (state_value); } while (0)
··· 110 #define TASK_RUNNING 0 111 #define TASK_INTERRUPTIBLE 1 112 #define TASK_UNINTERRUPTIBLE 2 113 + #define TASK_NONINTERACTIVE 4 114 + #define TASK_STOPPED 8 115 + #define TASK_TRACED 16 116 + #define EXIT_ZOMBIE 32 117 + #define EXIT_DEAD 64 118 119 #define __set_task_state(tsk, state_value) \ 120 do { (tsk)->state = (state_value); } while (0)