Change the way we ensure td_ucred is NULL if DIAGNOSTIC is defined.

Instead of caching the ucred reference, just go ahead and eat the
decerement and increment of the refcount.  Now that Giant is pushed down
into crfree(), we no longer have to get Giant in the common case.  In the
case when we are actually free'ing the ucred, we would normally free it on
the next kernel entry, so the cost there is not new, just in a different
place.  This also removse td_cache_ucred from struct thread.  This is
still only done #ifdef DIAGNOSTIC.

Tested on:	i386, alpha
This commit is contained in:
John Baldwin 2002-03-20 21:09:09 +00:00
parent c1a513c951
commit f25fcd64b8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=92824
8 changed files with 36 additions and 156 deletions

View File

@ -297,13 +297,6 @@ trap(a0, a1, a2, entry, framep)
if (user) {
sticks = td->td_kse->ke_sticks;
td->td_frame = framep;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
} else {
@ -631,12 +624,9 @@ trap(a0, a1, a2, entry, framep)
framep->tf_regs[FRAME_SP] = alpha_pal_rdusp();
userret(td, framep, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
}
return;
@ -705,12 +695,6 @@ syscall(code, framep)
td->td_frame = framep;
opc = framep->tf_regs[FRAME_PC] - 4;
sticks = td->td_kse->ke_sticks;
#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);
@ -833,12 +817,9 @@ syscall(code, framep)
*/
STOPEVENT(p, S_SCX, code);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
#ifdef WITNESS
if (witness_list(td)) {
panic("system call %s returning with mutex(s) held\n",

View File

@ -257,13 +257,6 @@ trap(frame)
sticks = td->td_kse->ke_sticks;
td->td_frame = &frame;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -651,12 +644,9 @@ trap(frame)
userret(td, &frame, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
userout:
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
out:
return;
}
@ -964,12 +954,6 @@ syscall(frame)
sticks = td->td_kse->ke_sticks;
td->td_frame = &frame;
#ifdef DIAGNOSTIC /* see the comment in ast() */
if (td->td_ucred)
panic("trap:thread got a cred while 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);
params = (caddr_t)frame.tf_esp + sizeof(int);
@ -1114,12 +1098,9 @@ syscall(frame)
*/
STOPEVENT(p, S_SCX, code);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
#ifdef WITNESS
if (witness_list(td)) {

View File

@ -257,13 +257,6 @@ trap(frame)
sticks = td->td_kse->ke_sticks;
td->td_frame = &frame;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -651,12 +644,9 @@ trap(frame)
userret(td, &frame, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
userout:
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
out:
return;
}
@ -964,12 +954,6 @@ syscall(frame)
sticks = td->td_kse->ke_sticks;
td->td_frame = &frame;
#ifdef DIAGNOSTIC /* see the comment in ast() */
if (td->td_ucred)
panic("trap:thread got a cred while 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);
params = (caddr_t)frame.tf_esp + sizeof(int);
@ -1114,12 +1098,9 @@ syscall(frame)
*/
STOPEVENT(p, S_SCX, code);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
#ifdef WITNESS
if (witness_list(td)) {

View File

@ -323,13 +323,6 @@ trap(int vector, int imm, struct trapframe *framep)
if (user) {
sticks = td->td_kse->ke_sticks;
td->td_frame = framep;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
} else {
@ -714,12 +707,9 @@ trap(int vector, int imm, struct trapframe *framep)
if (user) {
userret(td, framep, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
}
return;
@ -764,12 +754,6 @@ syscall(int code, u_int64_t *args, struct trapframe *framep)
td->td_frame = framep;
sticks = td->td_kse->ke_sticks;
#ifdef DIAGNOSTIC /* see the comment in ast() */
if (td->td_ucred)
panic("trap:thread got a cred while 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);
@ -876,12 +860,9 @@ syscall(int code, u_int64_t *args, struct trapframe *framep)
*/
STOPEVENT(p, S_SCX, code);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
#ifdef WITNESS
if (witness_list(td)) {
panic("system call %s returning with mutex(s) held\n",

View File

@ -226,13 +226,6 @@ trap(struct trapframe *frame)
if (user) {
sticks = td->td_kse->ke_sticks;
td->td_frame = frame;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -303,12 +296,9 @@ trap(struct trapframe *frame)
}
userret(td, frame, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
}
void

View File

@ -226,13 +226,6 @@ trap(struct trapframe *frame)
if (user) {
sticks = td->td_kse->ke_sticks;
td->td_frame = frame;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -303,12 +296,9 @@ trap(struct trapframe *frame)
}
userret(td, frame, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
}
void

View File

@ -177,13 +177,6 @@ trap(struct trapframe *tf)
if ((type & T_KERNEL) == 0) {
sticks = td->td_kse->ke_sticks;
td->td_frame = tf;
#ifdef DIAGNOSTIC
/* see the comment in ast() */
if (td->td_ucred != NULL)
panic("trap(): thread got a ucred while in userspace");
td->td_ucred = td->td_ucred_cache;
td->td_ucred_cache = NULL;
#endif
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
} else {
@ -387,12 +380,9 @@ if ((type & ~T_KERNEL) != T_BREAKPOINT)
user:
userret(td, tf, sticks);
mtx_assert(&Giant, MA_NOTOWNED);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
out:
CTR1(KTR_TRAP, "trap: td=%p return", td);
return;
@ -548,12 +538,6 @@ syscall(struct trapframe *tf)
sticks = td->td_kse->ke_sticks;
td->td_frame = tf;
#ifdef DIAGNOSTIC /* see the comment in ast() */
if (td->td_ucred)
panic("syscall:thread got a cred while 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);
code = tf->tf_global[1];
@ -690,12 +674,9 @@ syscall(struct trapframe *tf)
*/
STOPEVENT(p, S_SCX, code);
#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 /* DIAGNOSTIC */
#ifdef DIAGNOSTIC
cred_free_thread(td);
#endif
#ifdef WITNESS
if (witness_list(td)) {
panic("system call %s returning with mutex(s) held\n",

View File

@ -289,11 +289,6 @@ struct thread {
#define td_endcopy td_pcb
struct ucred *td_ucred; /* (k) Reference to credentials. */
#ifdef DIAGNOSTIC /* see the comment in ast() */
struct ucred *td_ucred_cache; /* (k) hide cred here for DIAGNOSTIC */
#else
void *td_dontuse; /* keep the size the same if not DIAG */
#endif
struct pcb *td_pcb; /* (k) Kernel VA of pcb and kstack. */
struct callout td_slpcallout; /* (h) Callout for sleep. */
struct trapframe *td_frame; /* (k) */