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.

[ missed this file in the previous commit ]

Tested on:	i386, alpha
This commit is contained in:
John Baldwin 2002-03-20 21:12:04 +00:00
parent f25fcd64b8
commit 01c04d2de9

View File

@ -161,29 +161,6 @@ ast(framep)
}
mtx_unlock_spin(&sched_lock);
#ifdef DIAGNOSTIC
/*
* As a diagnostic tool we make sure that td->td_ucred
* is NULL while we are in user space. This is
* because theoreticaly this field is only defined
* while the thread is in the kernel. Making it NULL
* will immediatly trap invalid usage of this field.
* In practice however we keep the reference to the ucred
* because it's almost always going to be the same cred we will
* need at the next syscall, and it can be expensive
* to keep dropping and reacquiring the reference.
* We thus stash it away elsewhere until we return
* to the kernel, where we bring it back. If
* DIAGNOSTIC is not defined we don't bother with
* making it NULL, and just leave it in place.
* (don't remove this comment without removing the pointers
* to it in sys/proc.h, trap.c, kern/kern_fork.c and here.)
*/
if (td->td_ucred)
panic("ast:thread got a cred before reaching AST");
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);
if (flags & KEF_OWEUPC && sflag & PS_PROFIL)
@ -210,13 +187,9 @@ ast(framep)
}
userret(td, framep, sticks);
#ifdef DIAGNOSTIC /* see comment above */
if (td->td_ucred_cache)
panic("ast: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
s = cpu_critical_enter();
}
mtx_assert(&Giant, MA_NOTOWNED);