Messages in this thread Patch in this message | | | Date | Sat, 30 Aug 2008 21:08:41 +0400 | From | Oleg Nesterov <> | Subject | [PATCH] proc: don't confuse /bin/ps by zombie delay_group_leader's |
| |
When the main thread exits,
void *do_thread(void *arg) { pause(); return NULL; }
int main(void) { pthread_t thr; pthread_create(&thr, NULL, do_thread, NULL);
syscall(__NR_exit, 0); return 0; }
/bin/ps's output looks really confusing, as if the whole process is dead. I think this even looks like a kernel bug to the user, because it sees a zombie which is not going to be reaped.
Change get_task_state() to report "S (sleeping)" in this case. Still not perfect because the task can be confused with the kernel thread (its ->mm is NULL), but imho better anyway.
Also, uninline get_task_state(), it has 2 callers.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
--- 2.6.27-rc4/fs/proc/array.c~ZOMBIE_LEADER 2008-07-30 13:12:47.000000000 +0400 +++ 2.6.27-rc4/fs/proc/array.c 2008-08-30 18:17:10.000000000 +0400 @@ -146,10 +146,14 @@ static const char *task_state_array[] = "X (dead)" /* 32 */ }; -static inline const char *get_task_state(struct task_struct *tsk) +static const char *get_task_state(struct task_struct *tsk) { - unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state; const char **p = &task_state_array[0]; + unsigned int state = tsk->exit_state | (tsk->state & TASK_REPORT); + + /* don't confuse /bin/ps if the whole process is not dead */ + if (tsk->exit_state && delay_group_leader(tsk)) + state = TASK_INTERRUPTIBLE; while (state) { p++;
| |