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-all
mailing list