Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Jun 2011 09:11:09 -0700
From:      Marcel Moolenaar <marcel@xcllnt.net>
To:        Nathan Whitehorn <nwhitehorn@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r223485 - in head/sys/powerpc: aim booke include ofw powerpc
Message-ID:  <1B2D07F9-3716-4581-8426-11BE78CE1D1F@xcllnt.net>
In-Reply-To: <201106232221.p5NMLSFj019042@svn.freebsd.org>
References:  <201106232221.p5NMLSFj019042@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On Jun 23, 2011, at 3:21 PM, Nathan Whitehorn wrote:

> Author: nwhitehorn
> Date: Thu Jun 23 22:21:28 2011
> New Revision: 223485
> URL: http://svn.freebsd.org/changeset/base/223485
>=20
> Log:
>  Use the ABI-mandated thread pointer register (r2 for ppc32, r13 for =
ppc64)
>  instead of a PCPU field for curthread. This averts a race on SMP =
systems
>  with a high interrupt rate where the thread looking up the value of
>  curthread could be preempted and migrated between obtaining the PCPU
>  pointer and reading the value of pc_curthread, resulting in curthread =
being
>  observed to be the current thread on the thread's original CPU. This =
played
>  merry havoc with the system, in particular with mutexes. Many thanks =
to
>  jhb for helping me work this one out.

Nice catch!

Another approach would be to have r2/r13 hold the address of the PCPU
structure and simply do a load from that address to get curthread.
The difference between the approaches is the need to to a memory load
or not for curthread. But with r2/r13 pointing to the PCPU, you may
be faster to get other PCPU fields if reading from the a SPR adds to
the overhead. Plus, it's easier to be atomic if you don't have to
read the SPR first and then do a load.

Is curthread the only field that needs to be atomically accessed or
are other fields in the PCPU susceptible to race conditions?

--=20
Marcel Moolenaar
marcel@xcllnt.net





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1B2D07F9-3716-4581-8426-11BE78CE1D1F>