Commit 05103a07 authored by Linus Torvalds's avatar Linus Torvalds

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.
parent 06d751b4
...@@ -538,7 +538,6 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) ...@@ -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) inline void signal_wake_up(struct task_struct *t, int resume)
{ {
unsigned int mask; unsigned int mask;
int woken;
set_tsk_thread_flag(t, TIF_SIGPENDING); set_tsk_thread_flag(t, TIF_SIGPENDING);
...@@ -552,10 +551,7 @@ inline void signal_wake_up(struct task_struct *t, int resume) ...@@ -552,10 +551,7 @@ inline void signal_wake_up(struct task_struct *t, int resume)
mask = TASK_INTERRUPTIBLE; mask = TASK_INTERRUPTIBLE;
if (resume) if (resume)
mask |= TASK_STOPPED; mask |= TASK_STOPPED;
woken = 0; if (!wake_up_state(t, mask))
if (t->state & mask)
woken = wake_up_state(t, mask);
if (!woken)
kick_process(t); kick_process(t);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment