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
[email protected]


_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to