Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa00b80b authored by Roland McGrath's avatar Roland McGrath Committed by Linus Torvalds
Browse files

tracehook: job control



This defines the tracehook_notify_jctl() hook to formalize the ptrace
effects on the job control notifications.  There is no change, only
cleanup.

Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Reviewed-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7bcf6a2c
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -451,4 +451,24 @@ static inline int tracehook_get_signal(struct task_struct *task,
	return 0;
}

/**
 * tracehook_notify_jctl - report about job control stop/continue
 * @notify:		nonzero if this is the last thread in the group to stop
 * @why:		%CLD_STOPPED or %CLD_CONTINUED
 *
 * This is called when we might call do_notify_parent_cldstop().
 * It's called when about to stop for job control; we are already in
 * %TASK_STOPPED state, about to call schedule().  It's also called when
 * a delayed %CLD_STOPPED or %CLD_CONTINUED report is ready to be made.
 *
 * Return nonzero to generate a %SIGCHLD with @why, which is
 * normal if @notify is nonzero.
 *
 * Called with no locks held.
 */
static inline int tracehook_notify_jctl(int notify, int why)
{
	return notify || (current->ptrace & PT_PTRACED);
}

#endif	/* <linux/tracehook.h> */
+5 −5
Original line number Diff line number Diff line
@@ -596,9 +596,6 @@ static int check_kill_permission(int sig, struct siginfo *info,
	return security_task_kill(t, info, sig, 0);
}

/* forward decl */
static void do_notify_parent_cldstop(struct task_struct *tsk, int why);

/*
 * Handle magic process-wide effects of stop/continue signals. Unlike
 * the signal actions, these happen immediately at signal-generation
@@ -1605,7 +1602,7 @@ finish_stop(int stop_count)
	 * a group stop in progress and we are the last to stop,
	 * report to the parent.  When ptraced, every thread reports itself.
	 */
	if (stop_count == 0 || (current->ptrace & PT_PTRACED)) {
	if (tracehook_notify_jctl(stop_count == 0, CLD_STOPPED)) {
		read_lock(&tasklist_lock);
		do_notify_parent_cldstop(current, CLD_STOPPED);
		read_unlock(&tasklist_lock);
@@ -1741,6 +1738,9 @@ relock:
		signal->flags &= ~SIGNAL_CLD_MASK;
		spin_unlock_irq(&sighand->siglock);

		if (unlikely(!tracehook_notify_jctl(1, why)))
			goto relock;

		read_lock(&tasklist_lock);
		do_notify_parent_cldstop(current->group_leader, why);
		read_unlock(&tasklist_lock);
@@ -1906,7 +1906,7 @@ void exit_signals(struct task_struct *tsk)
out:
	spin_unlock_irq(&tsk->sighand->siglock);

	if (unlikely(group_stop)) {
	if (unlikely(group_stop) && tracehook_notify_jctl(1, CLD_STOPPED)) {
		read_lock(&tasklist_lock);
		do_notify_parent_cldstop(tsk, CLD_STOPPED);
		read_unlock(&tasklist_lock);