summaryrefslogtreecommitdiffstats
path: root/arch/ia64/kernel/fsys.S
diff options
context:
space:
mode:
authorChristoph Lameter2005-06-09 21:29:00 +0200
committerTony Luck2005-06-09 22:04:30 +0200
commita2a64769d0d3cc0380b4b6ecdcb781a2f790a69e (patch)
tree387ee93cf8ee39ca64dd53380d1ea25a4f6134e7 /arch/ia64/kernel/fsys.S
parentMerge master.kernel.org:/home/rmk/linux-2.6-arm (diff)
downloadkernel-qcow2-linux-a2a64769d0d3cc0380b4b6ecdcb781a2f790a69e.tar.gz
kernel-qcow2-linux-a2a64769d0d3cc0380b4b6ecdcb781a2f790a69e.tar.xz
kernel-qcow2-linux-a2a64769d0d3cc0380b4b6ecdcb781a2f790a69e.zip
[IA64] Fix race condition in the rt_sigprocmask fastcall
current->blocked will be set to the value of current->thread_info->flags if the cmpxchg to update thread_info->flags fails. For performance reasons the store into current->blocked was placed in the cmpxchg loop. However, the cmpxchg overwrites the register holding the value to be stored. In the rare case of a retry the value of thread_info->flags will be written into current->blocked. The fix is to use another register so that the register containing the current->blocked value is not overwritten. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/fsys.S')
-rw-r--r--arch/ia64/kernel/fsys.S4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S
index 4f3cdef75797..962b6c4e32b5 100644
--- a/arch/ia64/kernel/fsys.S
+++ b/arch/ia64/kernel/fsys.S
@@ -460,9 +460,9 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
;;
st8 [r2]=r14 // update current->blocked with new mask
- cmpxchg4.acq r14=[r9],r18,ar.ccv // current->thread_info->flags <- r18
+ cmpxchg4.acq r8=[r9],r18,ar.ccv // current->thread_info->flags <- r18
;;
- cmp.ne p6,p0=r17,r14 // update failed?
+ cmp.ne p6,p0=r17,r8 // update failed?
(p6) br.cond.spnt.few 1b // yes -> retry
#ifdef CONFIG_SMP