Introduce utrace_set_resume() helper (please rename to whatever you like) to factor out the code in utrace_stop() and finish_report().
Note that utrace_set_resume() doesn have "task_struct *task" argument. This is correct, the task must be current. Signed-off-by: Oleg Nesterov <o...@redhat.com> --- kernel/utrace.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) --- UTRACE-PTRACE/kernel/utrace.c~3_SET_RESUME_HELPER 2009-11-19 02:40:52.000000000 +0100 +++ UTRACE-PTRACE/kernel/utrace.c 2009-11-19 02:55:42.000000000 +0100 @@ -833,6 +833,18 @@ void utrace_finish_stop(void) } } +static void utrace_set_resume(struct utrace *utrace, + enum utrace_resume_action action) +{ + if (action < utrace->resume) { + utrace->resume = action; + if (action == UTRACE_INTERRUPT) + set_thread_flag(TIF_SIGPENDING); + else + set_thread_flag(TIF_NOTIFY_RESUME); + } +} + /* * Perform %UTRACE_STOP, i.e. block in TASK_TRACED until woken up. * @task == current, @utrace == current->utrace, which is not locked. @@ -844,17 +856,10 @@ static void utrace_stop(struct task_stru { relock: spin_lock(&utrace->lock); - - if (action < utrace->resume) { - /* - * Ensure a reporting pass when we're resumed. - */ - utrace->resume = action; - if (action == UTRACE_INTERRUPT) - set_thread_flag(TIF_SIGPENDING); - else - set_thread_flag(TIF_NOTIFY_RESUME); - } + /* + * Ensure a reporting pass when we're resumed. + */ + utrace_set_resume(utrace, action); /* * If the ENGINE_STOP bit is clear in utrace_flags, that means @@ -1375,13 +1380,7 @@ static void finish_report(struct task_st if (resume < utrace->resume) { spin_lock(&utrace->lock); - if (resume < utrace->resume) { - utrace->resume = resume; - if (resume == UTRACE_INTERRUPT) - set_tsk_thread_flag(task, TIF_SIGPENDING); - else - set_tsk_thread_flag(task, TIF_NOTIFY_RESUME); - } + utrace_set_resume(utrace, resume); spin_unlock(&utrace->lock); }