|
@@ -1491,7 +1491,13 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
|
|
|
unsigned long flags;
|
|
|
int cpu, success = 0;
|
|
|
|
|
|
- smp_wmb();
|
|
|
+ /*
|
|
|
+ * If we are going to wake up a thread waiting for CONDITION we
|
|
|
+ * need to ensure that CONDITION=1 done by the caller can not be
|
|
|
+ * reordered with p->state check below. This pairs with mb() in
|
|
|
+ * set_current_state() the waiting thread does.
|
|
|
+ */
|
|
|
+ smp_mb__before_spinlock();
|
|
|
raw_spin_lock_irqsave(&p->pi_lock, flags);
|
|
|
if (!(p->state & state))
|
|
|
goto out;
|
|
@@ -2394,6 +2400,12 @@ need_resched:
|
|
|
if (sched_feat(HRTICK))
|
|
|
hrtick_clear(rq);
|
|
|
|
|
|
+ /*
|
|
|
+ * Make sure that signal_pending_state()->signal_pending() below
|
|
|
+ * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
|
|
|
+ * done by the caller to avoid the race with signal_wake_up().
|
|
|
+ */
|
|
|
+ smp_mb__before_spinlock();
|
|
|
raw_spin_lock_irq(&rq->lock);
|
|
|
|
|
|
switch_count = &prev->nivcsw;
|