Unverified Commit 1ab27856 authored by Mateusz Guzik's avatar Mateusz Guzik Committed by Christian Brauner
Browse files

exit: perform add_device_randomness() without tasklist_lock



Parallel calls to add_device_randomness() contend on their own.

The clone side aleady runs outside of tasklist_lock, which in turn means
any caller on the exit side extends the tasklist_lock hold time while
contending on the random-private lock.

Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarMateusz Guzik <mjguzik@gmail.com>
Link: https://lore.kernel.org/r/20250206164415.450051-2-mjguzik@gmail.com


Acked-by: default avatar"Liam R. Howlett" <Liam.Howlett@Oracle.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 33be3ffd
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -174,9 +174,6 @@ static void __exit_signal(struct task_struct *tsk)
			sig->curr_target = next_thread(tsk);
	}

	add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
			      sizeof(unsigned long long));

	/*
	 * Accumulate here the counters for all threads as they die. We could
	 * skip the group leader because it is the last user of signal_struct,
@@ -270,6 +267,8 @@ void release_task(struct task_struct *p)
	write_unlock_irq(&tasklist_lock);
	proc_flush_pid(thread_pid);
	put_pid(thread_pid);
	add_device_randomness(&p->se.sum_exec_runtime,
			      sizeof(p->se.sum_exec_runtime));
	release_thread(p);
	/*
	 * This task was already removed from the process/thread/pid lists