[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <875xu5h8uy.fsf_-_@email.froward.int.ebiederm.org>
Date: Tue, 18 Jun 2024 23:09:09 -0500
From: "Eric W. Biederman" <ebiederm@...ssion.com>
To: Oleg Nesterov <oleg@...hat.com>
Cc: Andrew Morton <akpm@...ux-foundation.org>, Tejun Heo <tj@...nel.org>,
linux-kernel@...r.kernel.org
Subject: [PATCH 09/17] signal: Test for process exit or de_thread using
task_exit_pending
Replace "(sig->flags & SIGNAL_GROUP_EXIT || sig->group_exec_task)"
with "task_exit_pending(tsk)".
THis is just a code simplification. Every case that sets
SIGNAL_GROUP_EXIT also sets JOBCTL_WILL_EXIT. Similarly de_thread
sets JOBCTL_WILL_EXIT except for the one task that will exist
after exec.
Signed-off-by: "Eric W. Biederman" <ebiederm@...ssion.com>
---
fs/coredump.c | 2 +-
fs/exec.c | 2 +-
kernel/signal.c | 6 ++----
3 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/fs/coredump.c b/fs/coredump.c
index c8b057724bf6..f3e363fa09a3 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -389,7 +389,7 @@ static int zap_threads(struct task_struct *tsk,
int nr = -EAGAIN;
spin_lock_irq(&tsk->sighand->siglock);
- if (!(signal->flags & SIGNAL_GROUP_EXIT) && !signal->group_exec_task) {
+ if (!task_exit_pending(tsk)) {
signal->core_state = core_state;
nr = zap_process(tsk, exit_code);
atomic_set(&core_state->nr_threads, nr);
diff --git a/fs/exec.c b/fs/exec.c
index 40073142288f..0d64313716bf 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1080,7 +1080,7 @@ static int de_thread(struct task_struct *tsk)
* Kill all other threads in the thread group.
*/
spin_lock_irq(lock);
- if ((sig->flags & SIGNAL_GROUP_EXIT) || sig->group_exec_task) {
+ if (task_exit_pending(tsk)) {
/*
* Another group action in progress, just
* return so that the signal is processed.
diff --git a/kernel/signal.c b/kernel/signal.c
index 5e67c00b9b30..12e552a35848 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2450,8 +2450,7 @@ static bool do_signal_stop(int signr)
WARN_ON_ONCE(signr & ~JOBCTL_STOP_SIGMASK);
if (!likely(current->jobctl & JOBCTL_STOP_DEQUEUED) ||
- unlikely(sig->flags & SIGNAL_GROUP_EXIT) ||
- unlikely(sig->group_exec_task))
+ unlikely(task_exit_pending(current)))
return false;
/*
* There is no group stop already in progress. We must
@@ -2747,8 +2746,7 @@ bool get_signal(struct ksignal *ksig)
int exit_code;
/* Has this task already been marked for death? */
- if ((signal->flags & SIGNAL_GROUP_EXIT) ||
- signal->group_exec_task) {
+ if (task_exit_pending(current)) {
signr = SIGKILL;
trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
&sighand->action[SIGKILL-1]);
--
2.41.0
Powered by blists - more mailing lists