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.
inline void signal_wake_up(struct task_struct *t, int resume)
{
unsigned int mask;
- int woken;
set_tsk_thread_flag(t, TIF_SIGPENDING);
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);
}