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:
parent
f25fcd64b8
commit
01c04d2de9
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user