diff options
author | mav <mav@FreeBSD.org> | 2012-03-03 11:50:48 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2012-03-03 11:50:48 +0000 |
commit | 15048326816f681f9e618227d01061b26b228a6a (patch) | |
tree | 674a74911d915a0c4a47cfb658e2c5d626ae9263 | |
parent | 0492460610eab914f504dbe0ee721d24716eb38c (diff) | |
download | FreeBSD-src-15048326816f681f9e618227d01061b26b228a6a.zip FreeBSD-src-15048326816f681f9e618227d01061b26b228a6a.tar.gz |
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).
-rw-r--r-- | sys/kern/sched_ule.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 126c135..c6b2d03 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -662,16 +662,18 @@ cpu_search(const struct cpu_group *cg, struct cpu_search *low, /* 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 flags) /* 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 flags) 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 |