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

Commit 29ff4712 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds
Browse files

[PATCH] cleanup __exit_signal()



This patch factors out duplicated code under 'if' branches.  Also, BUG_ON()
conversions and whitespace cleanups.

Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: default avatar"Paul E. McKenney" <paulmck@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6b3934ef
Loading
Loading
Loading
Loading
+15 −16
Original line number Original line Diff line number Diff line
@@ -344,21 +344,17 @@ void __exit_signal(struct task_struct *tsk)
	struct signal_struct *sig = tsk->signal;
	struct signal_struct *sig = tsk->signal;
	struct sighand_struct *sighand;
	struct sighand_struct *sighand;


	if (!sig)
	BUG_ON(!sig);
		BUG();
	BUG_ON(!atomic_read(&sig->count));
	if (!atomic_read(&sig->count))

		BUG();
	rcu_read_lock();
	rcu_read_lock();
	sighand = rcu_dereference(tsk->sighand);
	sighand = rcu_dereference(tsk->sighand);
	spin_lock(&sighand->siglock);
	spin_lock(&sighand->siglock);

	posix_cpu_timers_exit(tsk);
	posix_cpu_timers_exit(tsk);
	if (atomic_dec_and_test(&sig->count)) {
	if (atomic_dec_and_test(&sig->count))
		posix_cpu_timers_exit_group(tsk);
		posix_cpu_timers_exit_group(tsk);
		tsk->signal = NULL;
	else {
		__exit_sighand(tsk);
		spin_unlock(&sighand->siglock);
		flush_sigqueue(&sig->shared_pending);
	} else {
		/*
		/*
		 * If there is any task waiting for the group exit
		 * If there is any task waiting for the group exit
		 * then notify it:
		 * then notify it:
@@ -369,7 +365,6 @@ void __exit_signal(struct task_struct *tsk)
		}
		}
		if (tsk == sig->curr_target)
		if (tsk == sig->curr_target)
			sig->curr_target = next_thread(tsk);
			sig->curr_target = next_thread(tsk);
		tsk->signal = NULL;
		/*
		/*
		 * Accumulate here the counters for all threads but the
		 * Accumulate here the counters for all threads but the
		 * group leader as they die, so they can be added into
		 * group leader as they die, so they can be added into
@@ -387,14 +382,18 @@ void __exit_signal(struct task_struct *tsk)
		sig->nvcsw += tsk->nvcsw;
		sig->nvcsw += tsk->nvcsw;
		sig->nivcsw += tsk->nivcsw;
		sig->nivcsw += tsk->nivcsw;
		sig->sched_time += tsk->sched_time;
		sig->sched_time += tsk->sched_time;
		__exit_sighand(tsk);
		spin_unlock(&sighand->siglock);
		sig = NULL; /* Marker for below. */
		sig = NULL; /* Marker for below. */
	}
	}

	tsk->signal = NULL;
	__exit_sighand(tsk);
	spin_unlock(&sighand->siglock);
	rcu_read_unlock();
	rcu_read_unlock();

	clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
	clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
	flush_sigqueue(&tsk->pending);
	flush_sigqueue(&tsk->pending);
	if (sig) {
	if (sig) {
		flush_sigqueue(&sig->shared_pending);
		__cleanup_signal(sig);
		__cleanup_signal(sig);
	}
	}
}
}