svn commit: r223485 - in head/sys/powerpc: aim booke include ofw powerpc

Marcel Moolenaar marcel at xcllnt.net
Fri Jun 24 16:11:22 UTC 2011


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
> 
> 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?

-- 
Marcel Moolenaar
marcel at xcllnt.net




More information about the svn-src-head mailing list