From owner-svn-src-projects@FreeBSD.ORG Tue Feb 26 17:49:08 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 44CE02B0; Tue, 26 Feb 2013 17:49:08 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 1DBD612BD; Tue, 26 Feb 2013 17:49:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r1QHn7t7002046; Tue, 26 Feb 2013 17:49:07 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r1QHn7O2002045; Tue, 26 Feb 2013 17:49:07 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201302261749.r1QHn7O2002045@svn.freebsd.org> From: Alexander Motin Date: Tue, 26 Feb 2013 17:49:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r247325 - projects/calloutng/sys/kern X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Feb 2013 17:49:08 -0000 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(); } /*