فهرست منبع

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: Reassign prev and switch_count when reacquire_kernel_lock() fail
  sched: Fix vmark regression on big machines
Linus Torvalds 15 سال پیش
والد
کامیت
341031caec
3فایلهای تغییر یافته به همراه6 افزوده شده و 3 حذف شده
  1. 1 1
      include/linux/topology.h
  2. 4 1
      kernel/sched.c
  3. 1 1
      kernel/sched_fair.c

+ 1 - 1
include/linux/topology.h

@@ -99,7 +99,7 @@ int arch_update_cpu_topology(void);
 				| 1*SD_WAKE_AFFINE			\
 				| 1*SD_WAKE_AFFINE			\
 				| 1*SD_SHARE_CPUPOWER			\
 				| 1*SD_SHARE_CPUPOWER			\
 				| 0*SD_POWERSAVINGS_BALANCE		\
 				| 0*SD_POWERSAVINGS_BALANCE		\
-				| 0*SD_SHARE_PKG_RESOURCES		\
+				| 1*SD_SHARE_PKG_RESOURCES		\
 				| 0*SD_SERIALIZE			\
 				| 0*SD_SERIALIZE			\
 				| 0*SD_PREFER_SIBLING			\
 				| 0*SD_PREFER_SIBLING			\
 				,					\
 				,					\

+ 4 - 1
kernel/sched.c

@@ -5530,8 +5530,11 @@ need_resched_nonpreemptible:
 
 
 	post_schedule(rq);
 	post_schedule(rq);
 
 
-	if (unlikely(reacquire_kernel_lock(current) < 0))
+	if (unlikely(reacquire_kernel_lock(current) < 0)) {
+		prev = rq->curr;
+		switch_count = &prev->nivcsw;
 		goto need_resched_nonpreemptible;
 		goto need_resched_nonpreemptible;
+	}
 
 
 	preempt_enable_no_resched();
 	preempt_enable_no_resched();
 	if (need_resched())
 	if (need_resched())

+ 1 - 1
kernel/sched_fair.c

@@ -1508,7 +1508,7 @@ static int select_task_rq_fair(struct task_struct *p, int sd_flag, int wake_flag
 			 * If there's an idle sibling in this domain, make that
 			 * If there's an idle sibling in this domain, make that
 			 * the wake_affine target instead of the current cpu.
 			 * the wake_affine target instead of the current cpu.
 			 */
 			 */
-			if (tmp->flags & SD_PREFER_SIBLING)
+			if (tmp->flags & SD_SHARE_PKG_RESOURCES)
 				target = select_idle_sibling(p, tmp, target);
 				target = select_idle_sibling(p, tmp, target);
 
 
 			if (target >= 0) {
 			if (target >= 0) {