浏览代码

[PATCH] sched: consider migration thread with smp nice

The intermittent scheduling of the migration thread at ultra high priority
makes the smp nice handling see that runqueue as being heavily loaded.  The
migration thread itself actually handles the balancing so its influence on
priority balancing should be ignored.

Signed-off-by: Con Kolivas <kernel@kolivas.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Con Kolivas 19 年之前
父节点
当前提交
ede3d0fba9
共有 1 个文件被更改,包括 26 次插入9 次删除
  1. 26 9
      kernel/sched.c

+ 26 - 9
kernel/sched.c

@@ -670,6 +670,31 @@ static inline void dec_prio_bias(runqueue_t *rq, int prio)
 {
 {
 	rq->prio_bias -= MAX_PRIO - prio;
 	rq->prio_bias -= MAX_PRIO - prio;
 }
 }
+
+static inline void inc_nr_running(task_t *p, runqueue_t *rq)
+{
+	rq->nr_running++;
+	if (rt_task(p)) {
+		if (p != rq->migration_thread)
+			/*
+			 * The migration thread does the actual balancing. Do
+			 * not bias by its priority as the ultra high priority
+			 * will skew balancing adversely.
+			 */
+			inc_prio_bias(rq, p->prio);
+	} else
+		inc_prio_bias(rq, p->static_prio);
+}
+
+static inline void dec_nr_running(task_t *p, runqueue_t *rq)
+{
+	rq->nr_running--;
+	if (rt_task(p)) {
+		if (p != rq->migration_thread)
+			dec_prio_bias(rq, p->prio);
+	} else
+		dec_prio_bias(rq, p->static_prio);
+}
 #else
 #else
 static inline void inc_prio_bias(runqueue_t *rq, int prio)
 static inline void inc_prio_bias(runqueue_t *rq, int prio)
 {
 {
@@ -678,25 +703,17 @@ static inline void inc_prio_bias(runqueue_t *rq, int prio)
 static inline void dec_prio_bias(runqueue_t *rq, int prio)
 static inline void dec_prio_bias(runqueue_t *rq, int prio)
 {
 {
 }
 }
-#endif
 
 
 static inline void inc_nr_running(task_t *p, runqueue_t *rq)
 static inline void inc_nr_running(task_t *p, runqueue_t *rq)
 {
 {
 	rq->nr_running++;
 	rq->nr_running++;
-	if (rt_task(p))
-		inc_prio_bias(rq, p->prio);
-	else
-		inc_prio_bias(rq, p->static_prio);
 }
 }
 
 
 static inline void dec_nr_running(task_t *p, runqueue_t *rq)
 static inline void dec_nr_running(task_t *p, runqueue_t *rq)
 {
 {
 	rq->nr_running--;
 	rq->nr_running--;
-	if (rt_task(p))
-		dec_prio_bias(rq, p->prio);
-	else
-		dec_prio_bias(rq, p->static_prio);
 }
 }
+#endif
 
 
 /*
 /*
  * __activate_task - move a task to the runqueue.
  * __activate_task - move a task to the runqueue.