use __set_task_state() for TRACED/STOPPED tasks
Subsystems (4)
PATCH 1/1 use __set_task_state() for TRACED/STOPPED tasks
1. It is much easier to grep for ->state change if __set_task_state() is used instead of the direct assignment.
2. ptrace_stop() and handle_group_stop() use set_task_state() which adds the unneeded mb() (btw even if we use mb() it is still possible that do_wait() sees the new ->state but not ->exit_code, but this is ok).
Signed-off-by Oleg Nesterov <[email protected]>
kernel/fork.c renamed from kernel/fork.c~state +1 -1
@@ -1462,7 +1462,7 @@ long do_fork(unsigned long clone_flags,if (!(clone_flags &CLONE_STOPPED ))wake_up_new_task (p, clone_flags);else - p->state =TASK_STOPPED ; +__set_task_state (p,TASK_STOPPED );if (unlikely (trace)) { current->ptrace_message = nr;
kernel/ptrace.c renamed from kernel/ptrace.c~state +2 -2
@@ -53,7 +53,7 @@ void ptrace_untrace(struct task_struct *spin_lock (&child->sighand->siglock);if (child->state ==TASK_TRACED ) {if (child->signal->flags &SIGNAL_STOP_STOPPED ) { - child->state =TASK_STOPPED ; +__set_task_state (child,TASK_STOPPED ); }else {signal_wake_up (child,1 ); }
@@ -104,7 +104,7 @@ int ptrace_check_attach(struct task_stru ret =0 ;spin_lock_irq (&child->sighand->siglock);if (child->state ==TASK_STOPPED ) { - child->state =TASK_TRACED ; +__set_task_state (child,TASK_TRACED ); }else if (child->state !=TASK_TRACED && !kill) { ret = -ESRCH ; }
kernel/signal.c renamed from kernel/signal.c~state +2 -2
@@ -1617,7 +1617,7 @@ static void ptrace_stop(int exit_code, i current->exit_code = exit_code;/* Let the debugger run. */ -set_current_state (TASK_TRACED ); +__set_current_state (TASK_TRACED );spin_unlock_irq (¤t->sighand->siglock);try_to_freeze ();read_lock (&tasklist_lock);
@@ -1781,7 +1781,7 @@ static int handle_group_stop(void)if (stop_count ==0 ) current->signal->flags =SIGNAL_STOP_STOPPED ; current->exit_code = current->signal->group_exit_code; -set_current_state (TASK_STOPPED ); +__set_current_state (TASK_STOPPED );spin_unlock_irq (¤t->sighand->siglock);finish_stop (stop_count);return 1 ;
Looks fine to me.
Thanks,
Roland