Commit 2b1642b8 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://patch.msgid.link/20251119172549.706439391@linutronix.de
parent 539115f0
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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_after_execve(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)
{
	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_after_execve(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)
{
	/*
+1 −0
Original line number Diff line number Diff line
@@ -910,6 +910,7 @@ void __noreturn do_exit(long code)
	user_events_exit(tsk);

	io_uring_files_cancel();
	sched_mm_cid_exit(tsk);
	exit_signals(tsk);  /* sets PF_EXITING */

	seccomp_filter_release(tsk);
+2 −2
Original line number Diff line number Diff line
@@ -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);
}

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;

@@ -10410,7 +10410,7 @@ void sched_mm_cid_exit_signals(struct task_struct *t)
/* Deactivate MM CID allocation across execve() */
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() */
+0 −2
Original line number Diff line number Diff line
@@ -3125,7 +3125,6 @@ void exit_signals(struct task_struct *tsk)
	cgroup_threadgroup_change_begin(tsk);

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

	cgroup_threadgroup_change_end(tsk);