Commit bc505a47 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds

[PATCH] do_notify_parent_cldstop() cleanup

This patch simplifies the usage of do_notify_parent_cldstop(), it lessens
the source and .text size slightly, and makes the code (in my opinion) a
bit more readable.

I am sending this patch now because I'm afraid Paul will touch
do_notify_parent_cldstop() really soon, It's better to cleanup first.
Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2d237c63
...@@ -678,7 +678,7 @@ static int check_kill_permission(int sig, struct siginfo *info, ...@@ -678,7 +678,7 @@ static int check_kill_permission(int sig, struct siginfo *info,
/* forward decl */ /* forward decl */
static void do_notify_parent_cldstop(struct task_struct *tsk, static void do_notify_parent_cldstop(struct task_struct *tsk,
struct task_struct *parent, int to_self,
int why); int why);
/* /*
...@@ -729,14 +729,7 @@ static void handle_stop_signal(int sig, struct task_struct *p) ...@@ -729,14 +729,7 @@ static void handle_stop_signal(int sig, struct task_struct *p)
p->signal->group_stop_count = 0; p->signal->group_stop_count = 0;
p->signal->flags = SIGNAL_STOP_CONTINUED; p->signal->flags = SIGNAL_STOP_CONTINUED;
spin_unlock(&p->sighand->siglock); spin_unlock(&p->sighand->siglock);
if (p->ptrace & PT_PTRACED) do_notify_parent_cldstop(p, (p->ptrace & PT_PTRACED), CLD_STOPPED);
do_notify_parent_cldstop(p, p->parent,
CLD_STOPPED);
else
do_notify_parent_cldstop(
p->group_leader,
p->group_leader->real_parent,
CLD_STOPPED);
spin_lock(&p->sighand->siglock); spin_lock(&p->sighand->siglock);
} }
rm_from_queue(SIG_KERNEL_STOP_MASK, &p->signal->shared_pending); rm_from_queue(SIG_KERNEL_STOP_MASK, &p->signal->shared_pending);
...@@ -777,14 +770,7 @@ static void handle_stop_signal(int sig, struct task_struct *p) ...@@ -777,14 +770,7 @@ static void handle_stop_signal(int sig, struct task_struct *p)
p->signal->flags = SIGNAL_STOP_CONTINUED; p->signal->flags = SIGNAL_STOP_CONTINUED;
p->signal->group_exit_code = 0; p->signal->group_exit_code = 0;
spin_unlock(&p->sighand->siglock); spin_unlock(&p->sighand->siglock);
if (p->ptrace & PT_PTRACED) do_notify_parent_cldstop(p, (p->ptrace & PT_PTRACED), CLD_CONTINUED);
do_notify_parent_cldstop(p, p->parent,
CLD_CONTINUED);
else
do_notify_parent_cldstop(
p->group_leader,
p->group_leader->real_parent,
CLD_CONTINUED);
spin_lock(&p->sighand->siglock); spin_lock(&p->sighand->siglock);
} else { } else {
/* /*
...@@ -1542,14 +1528,20 @@ void do_notify_parent(struct task_struct *tsk, int sig) ...@@ -1542,14 +1528,20 @@ void do_notify_parent(struct task_struct *tsk, int sig)
spin_unlock_irqrestore(&psig->siglock, flags); spin_unlock_irqrestore(&psig->siglock, flags);
} }
static void static void do_notify_parent_cldstop(struct task_struct *tsk, int to_self, int why)
do_notify_parent_cldstop(struct task_struct *tsk, struct task_struct *parent,
int why)
{ {
struct siginfo info; struct siginfo info;
unsigned long flags; unsigned long flags;
struct task_struct *parent;
struct sighand_struct *sighand; struct sighand_struct *sighand;
if (to_self)
parent = tsk->parent;
else {
tsk = tsk->group_leader;
parent = tsk->real_parent;
}
info.si_signo = SIGCHLD; info.si_signo = SIGCHLD;
info.si_errno = 0; info.si_errno = 0;
info.si_pid = tsk->pid; info.si_pid = tsk->pid;
...@@ -1618,8 +1610,7 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) ...@@ -1618,8 +1610,7 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
!(current->ptrace & PT_ATTACHED)) && !(current->ptrace & PT_ATTACHED)) &&
(likely(current->parent->signal != current->signal) || (likely(current->parent->signal != current->signal) ||
!unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) { !unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) {
do_notify_parent_cldstop(current, current->parent, do_notify_parent_cldstop(current, 1, CLD_TRAPPED);
CLD_TRAPPED);
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
schedule(); schedule();
} else { } else {
...@@ -1668,25 +1659,25 @@ void ptrace_notify(int exit_code) ...@@ -1668,25 +1659,25 @@ void ptrace_notify(int exit_code)
static void static void
finish_stop(int stop_count) finish_stop(int stop_count)
{ {
int to_self;
/* /*
* If there are no other threads in the group, or if there is * If there are no other threads in the group, or if there is
* a group stop in progress and we are the last to stop, * a group stop in progress and we are the last to stop,
* report to the parent. When ptraced, every thread reports itself. * report to the parent. When ptraced, every thread reports itself.
*/ */
if (stop_count < 0 || (current->ptrace & PT_PTRACED)) { if (stop_count < 0 || (current->ptrace & PT_PTRACED))
read_lock(&tasklist_lock); to_self = 1;
do_notify_parent_cldstop(current, current->parent, else if (stop_count == 0)
CLD_STOPPED); to_self = 0;
read_unlock(&tasklist_lock); else
} goto out;
else if (stop_count == 0) {
read_lock(&tasklist_lock); read_lock(&tasklist_lock);
do_notify_parent_cldstop(current->group_leader, do_notify_parent_cldstop(current, to_self, CLD_STOPPED);
current->group_leader->real_parent,
CLD_STOPPED);
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
}
out:
schedule(); schedule();
/* /*
* Now we don't run again until continued. * Now we don't run again until continued.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment