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:
parent
2dbd040ba9
commit
ccc21e0aab
@ -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",
|
||||
|
@ -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)) {
|
||||
|
@ -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)) {
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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",
|
||||
|
@ -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) */
|
||||
|
Loading…
Reference in New Issue
Block a user