]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
signal: avoid clearing TIF_SIGPENDING in recalc_sigpending() if unset
authorMateusz Guzik <mjguzik@gmail.com>
Mon, 3 Mar 2025 13:49:08 +0000 (14:49 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 19:16:59 +0000 (12:16 -0700)
Clearing is an atomic op and the flag is not set most of the time.

When creating and destroying threads in the same process with the pthread
family, the primary bottleneck is calls to sigprocmask which take the
process-wide sighand lock.

Avoiding the atomic gives me a 2% bump in start/teardown rate at 24-core
scale.

[akpm@linux-foundation.org: add unlikely() as well]
Link: https://lkml.kernel.org/r/20250303134908.423242-1-mjguzik@gmail.com
Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/signal.c

index 875e97f6205a2c9daecf5bece5d53ed09667f747..ce3fae2f1fb5382d0b4c6805fcbd0415b5b86ec2 100644 (file)
@@ -176,9 +176,10 @@ static bool recalc_sigpending_tsk(struct task_struct *t)
 
 void recalc_sigpending(void)
 {
-       if (!recalc_sigpending_tsk(current) && !freezing(current))
-               clear_thread_flag(TIF_SIGPENDING);
-
+       if (!recalc_sigpending_tsk(current) && !freezing(current)) {
+               if (unlikely(test_thread_flag(TIF_SIGPENDING)))
+                       clear_thread_flag(TIF_SIGPENDING);
+       }
 }
 EXPORT_SYMBOL(recalc_sigpending);