svn commit: r190704 - head/sys/powerpc/aim
Marcel Moolenaar
marcel at FreeBSD.org
Sat Apr 4 15:23:04 PDT 2009
Author: marcel
Date: Sat Apr 4 22:23:03 2009
New Revision: 190704
URL: http://svn.freebsd.org/changeset/base/190704
Log:
Perform a dummy stwcx. when we switch contexts. The context
being switched out may hold a reservation. The stwcx. will
clear the reservation. This is architecturally recommended.
The scenario this addresses is as follows:
1. Thread 1 performs a lwarx and as such holds a reservation.
2. Thread 1 gets switched out (before doing the matching
stwcx.) and thread 2 is switched in.
3. Thread 2 performs a stwcx. to the same reservation granule.
This will succeed because the processor has the reservation
even though thread 2 didn't do the lwarx.
Note that on some processors the address given the stwcx. is
not checked. On these processors the mere condition of having
a reservation would cause the stwcx. to succeed, irrespective
of whether the addresses are the same. The dummy stwcx. is
especially important for those processors.
Modified:
head/sys/powerpc/aim/swtch.S
Modified: head/sys/powerpc/aim/swtch.S
==============================================================================
--- head/sys/powerpc/aim/swtch.S Sat Apr 4 22:05:36 2009 (r190703)
+++ head/sys/powerpc/aim/swtch.S Sat Apr 4 22:23:03 2009 (r190704)
@@ -155,6 +155,12 @@ cpu_switchin:
mtsr USER_SR,%r5
isync
lwz %r1,PCB_SP(%r3) /* Load the stack pointer */
+ /*
+ * Perform a dummy stwcx. to clear any reservations we may have
+ * inherited from the previous thread. It doesn't matter if the
+ * stwcx succeeds or not. pcb_context[0] can be clobbered.
+ */
+ stwcx. %r1, 0, %r3
blr
/*
More information about the svn-src-head
mailing list