From owner-svn-src-all@FreeBSD.ORG  Mon May 25 15:02:40 2015
Return-Path: <owner-svn-src-all@FreeBSD.ORG>
Delivered-To: svn-src-all@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115])
 (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by hub.freebsd.org (Postfix) with ESMTPS id 0A6A6C65
 for <svn-src-all@freebsd.org>; Mon, 25 May 2015 15:02:40 +0000 (UTC)
 (envelope-from ian@freebsd.org)
Received: from pmta2.delivery6.ore.mailhop.org
 (pmta2.delivery6.ore.mailhop.org [54.200.129.228])
 by mx1.freebsd.org (Postfix) with SMTP id BE589908
 for <svn-src-all@freebsd.org>; Mon, 25 May 2015 15:02:39 +0000 (UTC)
 (envelope-from ian@freebsd.org)
Received: from ilsoft.org (unknown [73.34.117.227])
 by outbound2.ore.mailhop.org (Halon Mail Gateway) with ESMTPSA;
 Mon, 25 May 2015 15:02:51 +0000 (UTC)
Received: from revolution.hippie.lan (revolution.hippie.lan [172.22.42.240])
 by ilsoft.org (8.14.9/8.14.9) with ESMTP id t4PF2WtV010640;
 Mon, 25 May 2015 09:02:32 -0600 (MDT) (envelope-from ian@freebsd.org)
Message-ID: <1432566152.1200.34.camel@freebsd.org>
Subject: Re: svn commit: r283331 - head/sys/arm/arm
From: Ian Lepore <ian@freebsd.org>
To: John Baldwin <jhb@freebsd.org>
Cc: Andrew Turner <andrew@freebsd.org>, src-committers@freebsd.org,
 svn-src-all@freebsd.org, svn-src-head@freebsd.org
Date: Mon, 25 May 2015 09:02:32 -0600
In-Reply-To: <1484557.5zjnsBffEc@ralph.baldwin.cx>
References: <201505232228.t4NMSxs2032365@svn.freebsd.org>
 <1484557.5zjnsBffEc@ralph.baldwin.cx>
Content-Type: text/plain; charset="us-ascii"
X-Mailer: Evolution 3.12.10 FreeBSD GNOME Team Port 
Mime-Version: 1.0
Content-Transfer-Encoding: 7bit
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.20
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
 user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all/>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 25 May 2015 15:02:40 -0000

On Mon, 2015-05-25 at 07:23 -0400, John Baldwin wrote:
> On Saturday, May 23, 2015 10:28:59 PM Andrew Turner wrote:
> > Author: andrew
> > Date: Sat May 23 22:28:59 2015
> > New Revision: 283331
> > URL: https://svnweb.freebsd.org/changeset/base/283331
> > 
> > Log:
> >   Use the wait-for-event instruction to put the core we have just enabled
> >   to sleep while it waits to start scheduling. The boot core can then use
> >   the send-event instruction to wake the cores when they should enter the
> >   scheduler.
> >   
> >   MFC after:	1 week
> > 
> > Modified:
> >   head/sys/arm/arm/mp_machdep.c
> > 
> > Modified: head/sys/arm/arm/mp_machdep.c
> > ==============================================================================
> > --- head/sys/arm/arm/mp_machdep.c	Sat May 23 21:58:41 2015	(r283330)
> > +++ head/sys/arm/arm/mp_machdep.c	Sat May 23 22:28:59 2015	(r283331)
> > @@ -185,8 +185,11 @@ init_secondary(int cpu)
> >  	atomic_add_rel_32(&mp_naps, 1);
> >  
> >  	/* Spin until the BSP releases the APs */
> > -	while (!aps_ready)
> > -		;
> > +	while (!atomic_load_acq_int(&aps_ready)) {
> > +#if __ARM_ARCH >= 7
> > +		__asm __volatile("wfe");
> > +#endif
> > +	}
> 
> I don't know that this atomic load acquire is really changing
> anything here?  Since aps_ready is volatile reading it should
> already be "atomic" on each check around the loop.
> 
> >  	/* Initialize curthread */
> >  	KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
> > @@ -353,6 +356,10 @@ release_aps(void *dummy __unused)
> >  		arm_unmask_irq(i);
> >  	}
> >  	atomic_store_rel_int(&aps_ready, 1);
> > +	/* Wake the other threads up */
> > +#if __ARM_ARCH >= 7
> > +	armv7_sev();
> > +#endif
> 
> So I'm not at all familiar with these instructions or what they do,
> but are the events level triggered?  In particular, is there any
> sort of race where the sev might arrive in between the check of
> aps_ready and the wfe on an AP?  (For example, if wfe/sev were
> similar to using mwait on x86 for wfe and a memory write for sev,
> x86 would require a call to monitor before doing a check of
> aps_ready to handle the race like so:
> 
> 	while (!aps_ready) {
> 		monitor(&aps_ready);
> 		if (!aps_ready)
> 			mwait();
> 	}
> 

The arm send-event/wait-for-event system includes a 1-bit event latch
per core that indicates whether an event arrived since the prior wait.
The latch is checked atomically by the hardware as part of going into
low-power mode, so you can't get stuck waiting by an event-arrival race,
you just need to be prepared to handle spurious wakeups.

-- Ian