Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Feb 2013 17:49:07 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r247325 - projects/calloutng/sys/kern
Message-ID:  <201302261749.r1QHn7O2002045@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Tue Feb 26 17:49:06 2013
New Revision: 247325
URL: http://svnweb.freebsd.org/changeset/base/247325

Log:
  Fix lock recursion during AP startup, triggered by attempt to reliably
  kick-start callout first time after AP startup, made at r247319.
  It was about hypotethical case when callout somehow scheduled on cold AP
  before SMP startup.
  
  Also rework r246205 SMP startup fix in different way.

Modified:
  projects/calloutng/sys/kern/kern_clocksource.c

Modified: projects/calloutng/sys/kern/kern_clocksource.c
==============================================================================
--- projects/calloutng/sys/kern/kern_clocksource.c	Tue Feb 26 17:33:18 2013	(r247324)
+++ projects/calloutng/sys/kern/kern_clocksource.c	Tue Feb 26 17:49:06 2013	(r247325)
@@ -236,10 +236,6 @@ handleevents(sbintime_t now, int fake)
 #endif
 
 	t = getnextcpuevent(0);
-	if (fake == 2) {
-		state->nextevent = t;
-		return (done);
-	}
 	ET_HW_LOCK(state);
 	if (!busy) {
 		state->idle = 0;
@@ -307,7 +303,7 @@ getnextevent(void)
 	event = state->nextevent;
 	c = curcpu;
 #ifdef SMP
-	if ((timer->et_flags & ET_FLAGS_PERCPU) == 0 && smp_started) {
+	if ((timer->et_flags & ET_FLAGS_PERCPU) == 0) {
 		CPU_FOREACH(cpu) {
 			state = DPCPU_ID_PTR(cpu, timerstate);
 			if (event > state->nextevent) {
@@ -517,7 +513,10 @@ configtimer(int start)
 		CPU_FOREACH(cpu) {
 			state = DPCPU_ID_PTR(cpu, timerstate);
 			state->now = now;
-			state->nextevent = next;
+			if (!smp_started && cpu != CPU_FIRST())
+				state->nextevent = INT64_MAX;
+			else
+				state->nextevent = next;
 			if (periodic)
 				state->nexttick = next;
 			else
@@ -689,16 +688,20 @@ cpu_initclocks_ap(void)
 {
 	sbintime_t now;
 	struct pcpu_state *state;
+	struct thread *td;
 
 	state = DPCPU_PTR(timerstate);
 	sbinuptime(&now);
 	ET_HW_LOCK(state);
 	state->now = now;
 	hardclock_sync(curcpu);
-	handleevents(state->now, 2);
-	if (timer->et_flags & ET_FLAGS_PERCPU)
-		loadtimer(now, 1);
+	spinlock_enter();
 	ET_HW_UNLOCK(state);
+	td = curthread;
+	td->td_intr_nesting_level++;
+	handleevents(state->now, 2);
+	td->td_intr_nesting_level--;
+	spinlock_exit();
 }
 
 /*



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