signal: Move MMCID exit out of sighand lock

There is no need anymore to keep this under sighand lock as the current
code and the upcoming replacement are not depending on the exit state of a
task anymore.

That allows to use a mutex in the exit path.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://patch.msgid.link/20251119172549.706439391@linutronix.de
This commit is contained in:
Thomas Gleixner 2025-11-19 18:27:05 +01:00
parent 539115f08c
commit 2b1642b881
4 changed files with 5 additions and 6 deletions

View File

@ -2298,7 +2298,7 @@ static __always_inline void alloc_tag_restore(struct alloc_tag *tag, struct allo
void sched_mm_cid_before_execve(struct task_struct *t); void sched_mm_cid_before_execve(struct task_struct *t);
void sched_mm_cid_after_execve(struct task_struct *t); void sched_mm_cid_after_execve(struct task_struct *t);
void sched_mm_cid_fork(struct task_struct *t); void sched_mm_cid_fork(struct task_struct *t);
void sched_mm_cid_exit_signals(struct task_struct *t); void sched_mm_cid_exit(struct task_struct *t);
static inline int task_mm_cid(struct task_struct *t) static inline int task_mm_cid(struct task_struct *t)
{ {
return t->mm_cid.cid; return t->mm_cid.cid;
@ -2307,7 +2307,7 @@ static inline int task_mm_cid(struct task_struct *t)
static inline void sched_mm_cid_before_execve(struct task_struct *t) { } static inline void sched_mm_cid_before_execve(struct task_struct *t) { }
static inline void sched_mm_cid_after_execve(struct task_struct *t) { } static inline void sched_mm_cid_after_execve(struct task_struct *t) { }
static inline void sched_mm_cid_fork(struct task_struct *t) { } static inline void sched_mm_cid_fork(struct task_struct *t) { }
static inline void sched_mm_cid_exit_signals(struct task_struct *t) { } static inline void sched_mm_cid_exit(struct task_struct *t) { }
static inline int task_mm_cid(struct task_struct *t) static inline int task_mm_cid(struct task_struct *t)
{ {
/* /*

View File

@ -910,6 +910,7 @@ void __noreturn do_exit(long code)
user_events_exit(tsk); user_events_exit(tsk);
io_uring_files_cancel(); io_uring_files_cancel();
sched_mm_cid_exit(tsk);
exit_signals(tsk); /* sets PF_EXITING */ exit_signals(tsk); /* sets PF_EXITING */
seccomp_filter_release(tsk); seccomp_filter_release(tsk);

View File

@ -10392,7 +10392,7 @@ static inline void mm_update_cpus_allowed(struct mm_struct *mm, const struct cpu
WRITE_ONCE(mm->mm_cid.nr_cpus_allowed, weight); WRITE_ONCE(mm->mm_cid.nr_cpus_allowed, weight);
} }
void sched_mm_cid_exit_signals(struct task_struct *t) void sched_mm_cid_exit(struct task_struct *t)
{ {
struct mm_struct *mm = t->mm; struct mm_struct *mm = t->mm;
@ -10410,7 +10410,7 @@ void sched_mm_cid_exit_signals(struct task_struct *t)
/* Deactivate MM CID allocation across execve() */ /* Deactivate MM CID allocation across execve() */
void sched_mm_cid_before_execve(struct task_struct *t) void sched_mm_cid_before_execve(struct task_struct *t)
{ {
sched_mm_cid_exit_signals(t); sched_mm_cid_exit(t);
} }
/* Reactivate MM CID after successful execve() */ /* Reactivate MM CID after successful execve() */

View File

@ -3125,7 +3125,6 @@ void exit_signals(struct task_struct *tsk)
cgroup_threadgroup_change_begin(tsk); cgroup_threadgroup_change_begin(tsk);
if (thread_group_empty(tsk) || (tsk->signal->flags & SIGNAL_GROUP_EXIT)) { if (thread_group_empty(tsk) || (tsk->signal->flags & SIGNAL_GROUP_EXIT)) {
sched_mm_cid_exit_signals(tsk);
tsk->flags |= PF_EXITING; tsk->flags |= PF_EXITING;
cgroup_threadgroup_change_end(tsk); cgroup_threadgroup_change_end(tsk);
return; return;
@ -3136,7 +3135,6 @@ void exit_signals(struct task_struct *tsk)
* From now this task is not visible for group-wide signals, * From now this task is not visible for group-wide signals,
* see wants_signal(), do_signal_stop(). * see wants_signal(), do_signal_stop().
*/ */
sched_mm_cid_exit_signals(tsk);
tsk->flags |= PF_EXITING; tsk->flags |= PF_EXITING;
cgroup_threadgroup_change_end(tsk); cgroup_threadgroup_change_end(tsk);