sched: symmetric sync vs avg_overlap
[safe/jmp/linux-2.6] / kernel / sched.c
index 770b1f9..242d0d4 100644 (file)
@@ -2266,9 +2266,15 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state, int sync)
        if (!sched_feat(SYNC_WAKEUPS))
                sync = 0;
 
-       if (!sync && (current->se.avg_overlap < sysctl_sched_migration_cost &&
-                           p->se.avg_overlap < sysctl_sched_migration_cost))
-               sync = 1;
+       if (!sync) {
+               if (current->se.avg_overlap < sysctl_sched_migration_cost &&
+                         p->se.avg_overlap < sysctl_sched_migration_cost)
+                       sync = 1;
+       } else {
+               if (current->se.avg_overlap >= sysctl_sched_migration_cost ||
+                         p->se.avg_overlap >= sysctl_sched_migration_cost)
+                       sync = 0;
+       }
 
 #ifdef CONFIG_SMP
        if (sched_feat(LB_WAKEUP_UPDATE)) {