From: Mateusz Guzik Date: Thu, 6 Feb 2025 16:44:10 +0000 (+0100) Subject: exit: perform add_device_randomness() without tasklist_lock X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1ab2785694971257f6a7dbd5a71bd8402b5fc305;p=users%2Fwilly%2Fxarray.git 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: Oleg Nesterov Signed-off-by: Mateusz Guzik Link: https://lore.kernel.org/r/20250206164415.450051-2-mjguzik@gmail.com Acked-by: "Liam R. Howlett" Signed-off-by: Christian Brauner --- diff --git a/kernel/exit.c b/kernel/exit.c index 0acb94b17caa..a00273db024b 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -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 @@ repeat: 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