|
@@ -2311,7 +2311,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
|
|
|
{
|
|
|
int cpu, orig_cpu, this_cpu, success = 0;
|
|
|
unsigned long flags;
|
|
|
- struct rq *rq;
|
|
|
+ struct rq *rq, *orig_rq;
|
|
|
|
|
|
if (!sched_feat(SYNC_WAKEUPS))
|
|
|
wake_flags &= ~WF_SYNC;
|
|
@@ -2319,7 +2319,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
|
|
|
this_cpu = get_cpu();
|
|
|
|
|
|
smp_wmb();
|
|
|
- rq = task_rq_lock(p, &flags);
|
|
|
+ rq = orig_rq = task_rq_lock(p, &flags);
|
|
|
update_rq_clock(rq);
|
|
|
if (!(p->state & state))
|
|
|
goto out;
|
|
@@ -2350,6 +2350,10 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
|
|
|
set_task_cpu(p, cpu);
|
|
|
|
|
|
rq = task_rq_lock(p, &flags);
|
|
|
+
|
|
|
+ if (rq != orig_rq)
|
|
|
+ update_rq_clock(rq);
|
|
|
+
|
|
|
WARN_ON(p->state != TASK_WAKING);
|
|
|
cpu = task_cpu(p);
|
|
|
|