From 05103a07d2e5df7f56fcedf08b078f81da9a36a8 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 10 Nov 2003 18:52:30 -0800 Subject: [PATCH] Avoid racy optimization in signal sending. The bug is probably impossible to trigger on x86, due to its fairly strong coherency model (the SMP-safe bitops end up being memory barriers etc), but other architectures - notably ppc64 - can apparently trigger a race whereby the signal sender doesn't wake up the target because it doesn't notice that it has gone to sleep. The optimization also optimizes only what appears to be the uncommon case, where the signal happens for an already-running process. --- kernel/signal.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/kernel/signal.c b/kernel/signal.c index 150062afd2331..e0675f1d5e9c2 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -538,7 +538,6 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) inline void signal_wake_up(struct task_struct *t, int resume) { unsigned int mask; - int woken; set_tsk_thread_flag(t, TIF_SIGPENDING); @@ -552,10 +551,7 @@ inline void signal_wake_up(struct task_struct *t, int resume) mask = TASK_INTERRUPTIBLE; if (resume) mask |= TASK_STOPPED; - woken = 0; - if (t->state & mask) - woken = wake_up_state(t, mask); - if (!woken) + if (!wake_up_state(t, mask)) kick_process(t); } -- 2.53.0