Skip to content

Commit 8a56f26

Browse files
mjguzikakpm00
authored andcommitted
signal: avoid clearing TIF_SIGPENDING in recalc_sigpending() if unset
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>
1 parent e0349c4 commit 8a56f26

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

kernel/signal.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,10 @@ static bool recalc_sigpending_tsk(struct task_struct *t)
176176

177177
void recalc_sigpending(void)
178178
{
179-
if (!recalc_sigpending_tsk(current) && !freezing(current))
180-
clear_thread_flag(TIF_SIGPENDING);
181-
179+
if (!recalc_sigpending_tsk(current) && !freezing(current)) {
180+
if (unlikely(test_thread_flag(TIF_SIGPENDING)))
181+
clear_thread_flag(TIF_SIGPENDING);
182+
}
182183
}
183184
EXPORT_SYMBOL(recalc_sigpending);
184185

0 commit comments

Comments
 (0)