summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2002-02-22 23:58:22 +0000
committerjulian <julian@FreeBSD.org>2002-02-22 23:58:22 +0000
commit53eb1d92192d6566baf1ef330f636ab7b9d70f4f (patch)
tree7d75b1e48c3b7ef34eb52967d22fcf93f2addadc /sys/alpha
parent5b69d7da62f2398a3ef361c86be5ab099fd92ad0 (diff)
downloadFreeBSD-src-53eb1d92192d6566baf1ef330f636ab7b9d70f4f.zip
FreeBSD-src-53eb1d92192d6566baf1ef330f636ab7b9d70f4f.tar.gz
Add some DIAGNOSTIC code.
While in userland, keep the thread's ucred reference in a shadow field so that the usual place to store it is NULL. If DIAGNOSTIC is not set, the thread ucred is kept valid until the next kernel entry, at which time it is checked against the process cred and possibly corrected. Produces a BIG speedup in kernels with INVARIANTS set. (A previous commit corrected it for the non INVARIANTS case already) Reviewed by: dillon@freebsd.org
Diffstat (limited to 'sys/alpha')
-rw-r--r--sys/alpha/alpha/trap.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/sys/alpha/alpha/trap.c b/sys/alpha/alpha/trap.c
index 2cdf540d..c0b1327 100644
--- a/sys/alpha/alpha/trap.c
+++ b/sys/alpha/alpha/trap.c
@@ -297,7 +297,12 @@ trap(a0, a1, a2, entry, framep)
if (user) {
sticks = td->td_kse->ke_sticks;
td->td_frame = framep;
- KASSERT(td->td_ucred == NULL, ("already have a ucred"));
+#ifdef DIAGNOSTIC /* see the comment in ast() */
+ if (td->td_ucred)
+ panic("trap: thread got a cred while in userspace");
+ td->td_ucred = td->td_ucred_cache;
+ td->td_ucred_cache = NULL;
+#endif /* DIAGNOSTIC */
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
} else {
@@ -625,12 +630,12 @@ out:
framep->tf_regs[FRAME_SP] = alpha_pal_rdusp();
userret(td, framep, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
-#ifdef INVARIANTS
- mtx_lock(&Giant);
- crfree(td->td_ucred);
- mtx_unlock(&Giant);
+#ifdef DIAGNOSTIC /* see the comment in ast() */
+ if (td->td_ucred_cache)
+ panic("trap: thread already has cached ucred");
+ td->td_ucred_cache = td->td_ucred;
td->td_ucred = NULL;
-#endif
+#endif /* DIAGNOSTIC */
}
return;
@@ -699,7 +704,12 @@ syscall(code, framep)
td->td_frame = framep;
opc = framep->tf_regs[FRAME_PC] - 4;
sticks = td->td_kse->ke_sticks;
- KASSERT(td->td_ucred == NULL, ("already have a ucred"));
+#ifdef DIAGNOSTIC /* see the comment in ast() */
+ if (td->td_ucred)
+ panic("syscall:thread got a cred while in userspace");
+ td->td_ucred = td->td_ucred_cache;
+ td->td_ucred_cache = NULL;
+#endif /* DIAGNOSTIC */
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@@ -822,12 +832,12 @@ syscall(code, framep)
*/
STOPEVENT(p, S_SCX, code);
-#ifdef INVARIANTS
- mtx_lock(&Giant);
- crfree(td->td_ucred);
- mtx_unlock(&Giant);
+#ifdef DIAGNOSTIC /* see the comment in ast() */
+ if (td->td_ucred_cache)
+ panic("syscall:thread already has cached ucred");
+ td->td_ucred_cache = td->td_ucred;
td->td_ucred = NULL;
-#endif
+#endif /* DIAGNOSTIC */
#ifdef WITNESS
if (witness_list(td)) {
panic("system call %s returning with mutex(s) held\n",
OpenPOWER on IntegriCloud