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]"
