浏览代码

Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  sched: revert recent sync wakeup changes
Linus Torvalds 16 年之前
父节点
当前提交
6c6f1f0f4d
共有 2 个文件被更改,包括 9 次插入12 次删除
  1. 0 10
      kernel/sched.c
  2. 9 2
      kernel/sched_fair.c

+ 0 - 10
kernel/sched.c

@@ -2266,16 +2266,6 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state, int sync)
 	if (!sched_feat(SYNC_WAKEUPS))
 	if (!sched_feat(SYNC_WAKEUPS))
 		sync = 0;
 		sync = 0;
 
 
-	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
 #ifdef CONFIG_SMP
 	if (sched_feat(LB_WAKEUP_UPDATE)) {
 	if (sched_feat(LB_WAKEUP_UPDATE)) {
 		struct sched_domain *sd;
 		struct sched_domain *sd;

+ 9 - 2
kernel/sched_fair.c

@@ -1191,15 +1191,20 @@ wake_affine(struct sched_domain *this_sd, struct rq *this_rq,
 	    int idx, unsigned long load, unsigned long this_load,
 	    int idx, unsigned long load, unsigned long this_load,
 	    unsigned int imbalance)
 	    unsigned int imbalance)
 {
 {
+	struct task_struct *curr = this_rq->curr;
+	struct task_group *tg;
 	unsigned long tl = this_load;
 	unsigned long tl = this_load;
 	unsigned long tl_per_task;
 	unsigned long tl_per_task;
-	struct task_group *tg;
 	unsigned long weight;
 	unsigned long weight;
 	int balanced;
 	int balanced;
 
 
 	if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS))
 	if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS))
 		return 0;
 		return 0;
 
 
+	if (sync && (curr->se.avg_overlap > sysctl_sched_migration_cost ||
+			p->se.avg_overlap > sysctl_sched_migration_cost))
+		sync = 0;
+
 	/*
 	/*
 	 * If sync wakeup then subtract the (maximum possible)
 	 * If sync wakeup then subtract the (maximum possible)
 	 * effect of the currently running task from the load
 	 * effect of the currently running task from the load
@@ -1426,7 +1431,9 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync)
 	if (!sched_feat(WAKEUP_PREEMPT))
 	if (!sched_feat(WAKEUP_PREEMPT))
 		return;
 		return;
 
 
-	if (sched_feat(WAKEUP_OVERLAP) && sync) {
+	if (sched_feat(WAKEUP_OVERLAP) && (sync ||
+			(se->avg_overlap < sysctl_sched_migration_cost &&
+			 pse->avg_overlap < sysctl_sched_migration_cost))) {
 		resched_task(curr);
 		resched_task(curr);
 		return;
 		return;
 	}
 	}