Signed-off-by: Paolo 'Blaisorblade' Giarrusso --- um-linux-2.4.27-paolo/arch/um/include/os.h | 1 + um-linux-2.4.27-paolo/arch/um/kernel/skas/process.c | 2 +- um-linux-2.4.27-paolo/arch/um/kernel/tt/exec_user.c | 2 +- um-linux-2.4.27-paolo/arch/um/kernel/tt/tracer.c | 8 +++++++- um-linux-2.4.27-paolo/arch/um/os-Linux/process.c | 17 ++++++++++++++++- 5 files changed, 26 insertions(+), 4 deletions(-) diff -puN arch/um/include/os.h~fix-hang-on-2.6.9-host arch/um/include/os.h --- um-linux-2.4.27/arch/um/include/os.h~fix-hang-on-2.6.9-host 2005-04-15 11:13:05.000000000 +0200 +++ um-linux-2.4.27-paolo/arch/um/include/os.h 2005-04-15 11:13:05.000000000 +0200 @@ -156,6 +156,7 @@ extern unsigned long os_process_pc(int p extern int os_process_parent(int pid); extern void os_stop_process(int pid); extern void os_kill_process(int pid, int reap_child); +extern void os_kill_ptraced_process(int pid, int reap_child); extern void os_usr1_process(int pid); extern int os_getpid(void); diff -puN arch/um/kernel/skas/process.c~fix-hang-on-2.6.9-host arch/um/kernel/skas/process.c --- um-linux-2.4.27/arch/um/kernel/skas/process.c~fix-hang-on-2.6.9-host 2005-04-15 11:13:05.000000000 +0200 +++ um-linux-2.4.27-paolo/arch/um/kernel/skas/process.c 2005-04-15 11:13:05.000000000 +0200 @@ -379,7 +379,7 @@ void switch_mm_skas(int mm_fd) void kill_off_processes_skas(void) { #warning need to loop over userspace_pids in kill_off_processes_skas - os_kill_process(userspace_pid[0], 1); + os_kill_ptraced_process(userspace_pid[0], 1); } void init_registers(int pid) diff -puN arch/um/kernel/tt/exec_user.c~fix-hang-on-2.6.9-host arch/um/kernel/tt/exec_user.c --- um-linux-2.4.27/arch/um/kernel/tt/exec_user.c~fix-hang-on-2.6.9-host 2005-04-15 11:13:05.000000000 +0200 +++ um-linux-2.4.27-paolo/arch/um/kernel/tt/exec_user.c 2005-04-15 11:13:05.000000000 +0200 @@ -35,7 +35,7 @@ void do_exec(int old_pid, int new_pid) tracer_panic("do_exec failed to get registers - errno = %d", errno); - kill(old_pid, SIGKILL); + os_kill_ptraced_process(old_pid, 0); if(ptrace_setregs(new_pid, regs) < 0) tracer_panic("do_exec failed to start new proc - errno = %d", diff -puN arch/um/kernel/tt/tracer.c~fix-hang-on-2.6.9-host arch/um/kernel/tt/tracer.c --- um-linux-2.4.27/arch/um/kernel/tt/tracer.c~fix-hang-on-2.6.9-host 2005-04-15 11:13:05.000000000 +0200 +++ um-linux-2.4.27-paolo/arch/um/kernel/tt/tracer.c 2005-04-15 11:13:05.000000000 +0200 @@ -310,7 +310,13 @@ int tracer(int (*init_proc)(void *), voi case OP_HALT: unmap_physmem(); kmalloc_ok = 0; - ptrace(PTRACE_KILL, pid, 0, 0); + os_kill_ptraced_process(pid, 0); + /* Now let's reap remaining zombies */ + errno = 0; + do { + waitpid(-1, &status, + WUNTRACED); + } while (errno != ECHILD); return(op == OP_REBOOT); case OP_NONE: printf("Detaching pid %d\n", pid); diff -puN arch/um/os-Linux/process.c~fix-hang-on-2.6.9-host arch/um/os-Linux/process.c --- um-linux-2.4.27/arch/um/os-Linux/process.c~fix-hang-on-2.6.9-host 2005-04-15 11:13:05.000000000 +0200 +++ um-linux-2.4.27-paolo/arch/um/os-Linux/process.c 2005-04-15 11:13:05.000000000 +0200 @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "os.h" @@ -83,12 +84,26 @@ void os_stop_process(int pid) kill(pid, SIGSTOP); } + void os_kill_process(int pid, int reap_child) { + kill(pid, SIGKILL); + if(reap_child) + CATCH_EINTR(waitpid(pid, NULL, 0)); +} + +/* Kill off a ptraced child by all means available. kill it normally first, + * then PTRACE_KILL it, then PTRACE_CONT it in case it's in a run state from + * which it can't exit directly. + */ + +void os_kill_ptraced_process(int pid, int reap_child) +{ kill(pid, SIGKILL); + ptrace(PTRACE_KILL, pid); + ptrace(PTRACE_CONT, pid); if(reap_child) CATCH_EINTR(waitpid(pid, NULL, 0)); - } void os_usr1_process(int pid) _