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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to