diff options
author | Bryan Cantrill <bryan@joyent.com> | 2013-07-27 11:12:12 -0700 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2013-08-02 09:34:43 -0700 |
commit | 49dc33e37f0b57cc47ce0a40a5dffaf6627bae4d (patch) | |
tree | 126054cf2f67c455234fdd0f5d56cef5125aec51 /usr/src | |
parent | 299625c6492013aa7bd163862f0d181854f69b3c (diff) | |
download | illumos-joyent-49dc33e37f0b57cc47ce0a40a5dffaf6627bae4d.tar.gz |
3917 panic in turnstile_block() on unowned mutex
Reviewed by: Robert Mustacchi <rm@joyent.com>
Approved by: Gordon Ross <gwr@nexenta.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/intel/ia32/ml/swtch.s | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/usr/src/uts/intel/ia32/ml/swtch.s b/usr/src/uts/intel/ia32/ml/swtch.s index 40be9e4e34..331c38d00e 100644 --- a/usr/src/uts/intel/ia32/ml/swtch.s +++ b/usr/src/uts/intel/ia32/ml/swtch.s @@ -23,7 +23,9 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2013, Joyent, Inc. All rights reserved. + */ /* * Process switching routines. @@ -355,6 +357,7 @@ resume(kthread_t *t) #endif /* __xpv */ movq %r12, CPU_THREAD(%r13) /* set CPU's thread pointer */ + mfence /* synchronize with mutex_exit() */ xorl %ebp, %ebp /* make $<threadlist behave better */ movq T_LWP(%r12), %rax /* set associated lwp to */ movq %rax, CPU_LWP(%r13) /* CPU's lwp ptr */ @@ -519,6 +522,7 @@ resume_return: #endif /* __xpv */ movl %edi, CPU_THREAD(%esi) /* set CPU's thread pointer */ + mfence /* synchronize with mutex_exit() */ xorl %ebp, %ebp /* make $<threadlist behave better */ movl T_LWP(%edi), %eax /* set associated lwp to */ movl %eax, CPU_LWP(%esi) /* CPU's lwp ptr */ @@ -768,6 +772,7 @@ resume_from_intr(kthread_t *t) movq %gs:CPU_THREAD, %r13 /* %r13 = curthread */ movq %r12, %gs:CPU_THREAD /* set CPU's thread pointer */ + mfence /* synchronize with mutex_exit() */ movq T_SP(%r12), %rsp /* restore resuming thread's sp */ xorl %ebp, %ebp /* make $<threadlist behave better */ @@ -817,6 +822,7 @@ resume_from_intr_return: #endif movl %gs:CPU_THREAD, %esi /* %esi = curthread */ movl %edi, %gs:CPU_THREAD /* set CPU's thread pointer */ + mfence /* synchronize with mutex_exit() */ movl T_SP(%edi), %esp /* restore resuming thread's sp */ xorl %ebp, %ebp /* make $<threadlist behave better */ |