Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Jul 2016 13:17:42 -0700
From:      John Baldwin <jhb@freebsd.org>
To:        gljennjohn@gmail.com
Cc:        current@freebsd.org
Subject:   Re: EARLY_AP_STARTUP hangs during boot
Message-ID:  <2732687.Cf9hD9SkSs@ralph.baldwin.cx>
In-Reply-To: <20160728003131.1f67bb78@ernst.home>
References:  <20160516122242.39249a54@ernst.home> <1758017.P1iqL9uSnF@ralph.baldwin.cx> <20160728003131.1f67bb78@ernst.home>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday, July 28, 2016 12:31:31 AM Gary Jennejohn wrote:
> Well, now I know that ULE is a prerequiste for EARLY_AP_STARTUP!  I
> wasn't aware of that.  I prefer BSD and that's the scheduler I did
> the first tests with.
> 
> But with the ULE scheduler the system comes up all the way.
> 
> It would be nice if the BSD scheduler could also be modified to
> work with EARLY_AP_STARTUP.

I wasn't able to reproduce your hang with 4BSD, but I think I see a
possible problem.  Try this:

diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 7de56b6..d53331a 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -327,7 +327,6 @@ maybe_preempt(struct thread *td)
 	 *  - The current thread has a higher (numerically lower) or
 	 *    equivalent priority.  Note that this prevents curthread from
 	 *    trying to preempt to itself.
-	 *  - It is too early in the boot for context switches (cold is set).
 	 *  - The current thread has an inhibitor set or is in the process of
 	 *    exiting.  In this case, the current thread is about to switch
 	 *    out anyways, so there's no point in preempting.  If we did,
@@ -348,7 +347,7 @@ maybe_preempt(struct thread *td)
 			("maybe_preempt: trying to run inhibited thread"));
 	pri = td->td_priority;
 	cpri = ctd->td_priority;
-	if (panicstr != NULL || pri >= cpri || cold /* || dumping */ ||
+	if (panicstr != NULL || pri >= cpri /* || dumping */ ||
 	    TD_IS_INHIBITED(ctd))
 		return (0);
 #ifndef FULL_PREEMPTION
@@ -1127,7 +1126,7 @@ forward_wakeup(int cpunum)
 	if ((!forward_wakeup_enabled) ||
 	     (forward_wakeup_use_mask == 0 && forward_wakeup_use_loop == 0))
 		return (0);
-	if (!smp_started || cold || panicstr)
+	if (!smp_started || panicstr)
 		return (0);
 
 	forward_wakeups_requested++;


-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2732687.Cf9hD9SkSs>