svn commit: r232454 - head/sys/kern

Alexander Motin mav at FreeBSD.org
Sat Mar 3 11:50:49 UTC 2012


Author: mav
Date: Sat Mar  3 11:50:48 2012
New Revision: 232454
URL: http://svn.freebsd.org/changeset/base/232454

Log:
  Fix bug of r232207, when cpu_search() could prefer CPU group with best
  load, but with no CPU matching given limitations. It caused kernel panics
  in some cases when thread was bound to specific CPUs with cpuset(1).

Modified:
  head/sys/kern/sched_ule.c

Modified: head/sys/kern/sched_ule.c
==============================================================================
--- head/sys/kern/sched_ule.c	Sat Mar  3 11:11:56 2012	(r232453)
+++ head/sys/kern/sched_ule.c	Sat Mar  3 11:50:48 2012	(r232454)
@@ -662,16 +662,18 @@ cpu_search(const struct cpu_group *cg, s
 
 		/* We have info about child item. Compare it. */
 		if (match & CPU_SEARCH_LOWEST) {
-			if ((load < lload) ||
-			    (load == lload && lgroup.cs_load < low->cs_load)) {
+			if (lgroup.cs_load != INT_MAX &&
+			    (load < lload ||
+			     (load == lload && lgroup.cs_load < low->cs_load))) {
 				lload = load;
 				low->cs_cpu = lgroup.cs_cpu;
 				low->cs_load = lgroup.cs_load;
 			}
 		}
 		if (match & CPU_SEARCH_HIGHEST)
-			if ((load > hload) ||
-			    (load == hload && hgroup.cs_load > high->cs_load)) {
+			if (hgroup.cs_load != -1 &&
+			    (load > hload ||
+			     (load == hload && hgroup.cs_load > high->cs_load))) {
 				hload = load;
 				high->cs_cpu = hgroup.cs_cpu;
 				high->cs_load = hgroup.cs_load;
@@ -1230,6 +1232,7 @@ sched_pickcpu(struct thread *td, int fla
 	/* Search globally for the less loaded CPU. */
 	if (cpu == -1)
 		cpu = sched_lowest(cpu_top, mask, -1, INT_MAX, ts->ts_cpu);
+	KASSERT(cpu != -1, ("sched_pickcpu: Failed to find a cpu."));
 	/*
 	 * Compare the lowest loaded cpu to current cpu.
 	 */
@@ -1242,7 +1245,6 @@ sched_pickcpu(struct thread *td, int fla
 		SCHED_STAT_INC(pickcpu_lowest);
 	if (cpu != ts->ts_cpu)
 		SCHED_STAT_INC(pickcpu_migration);
-	KASSERT(cpu != -1, ("sched_pickcpu: Failed to find a cpu."));
 	return (cpu);
 }
 #endif


More information about the svn-src-head mailing list