diff options
author | Mateusz Guzik <mjguzik@gmail.com> | 2025-02-06 17:44:10 +0100 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2025-02-07 11:22:43 +0100 |
commit | 1ab2785694971257f6a7dbd5a71bd8402b5fc305 (patch) | |
tree | 29bac9b3584e866b1af9241af4ac5e93fb20c2ae | |
parent | 33be3ffd30b3ae67c7a1a405f98b963fd915d61a (diff) |
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 <oleg@redhat.com>
Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Link: https://lore.kernel.org/r/20250206164415.450051-2-mjguzik@gmail.com
Acked-by: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r-- | kernel/exit.c | 5 |
1 files changed, 2 insertions, 3 deletions
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 |