From 789b14d360c08ba7457524b8c2386fcd9f1b3920 Mon Sep 17 00:00:00 2001 From: mav Date: Sat, 3 Mar 2012 11:50:48 +0000 Subject: [PATCH 086/175] 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). git-svn-id: http://svn.freebsd.org/base/head@232454 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f (cherry picked from commit c07ea85b22b58f50ae892db017ccc8a1c7d37b89) Signed-off-by: Xin Li --- sys/kern/sched_ule.c | 12 +++++++----- 1 file 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 -- 1.7.9.4