summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-01-23 21:07:52 +0000
committerrwatson <rwatson@FreeBSD.org>2004-01-23 21:07:52 +0000
commit597deaa7b82de573cdd1aee2920ecf0bbce8ab0b (patch)
tree36e3b87c6461c0d0034aec33446e4e60242bd51c
parent67d83922288af8f8de614c65bfc3661494fc8e98 (diff)
downloadFreeBSD-src-597deaa7b82de573cdd1aee2920ecf0bbce8ab0b.zip
FreeBSD-src-597deaa7b82de573cdd1aee2920ecf0bbce8ab0b.tar.gz
Don't grab Giant in crfree(), since prison_free() no longer requires it.
The uidinfo code appears to be MPSAFE, and is referenced without Giant elsewhere. While this grab of Giant was only made in fairly rare circumstances (actually GC'ing on refcount==0), grabbing Giant here potentially introduces lock order issues with any locks held by the caller. So this probably won't help performance much unless you change credentials a lot in an application, and leave a lot of file descriptors and cached credentials around. However, it simplifies locking down consumers of the credential interfaces. Bumped into by: sam Appeased: tjr
-rw-r--r--sys/kern/kern_prot.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index d6ecb3f..1d8f07e 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -1746,13 +1746,12 @@ crfree(struct ucred *cr)
mtx_lock(mtxp);
KASSERT(cr->cr_ref > 0, ("bad ucred refcount: %d", cr->cr_ref));
if (--cr->cr_ref == 0) {
+ mtx_unlock(mtxp);
/*
* Some callers of crget(), such as nfs_statfs(),
* allocate a temporary credential, but don't
* allocate a uidinfo structure.
*/
- mtx_unlock(mtxp);
- mtx_lock(&Giant);
if (cr->cr_uidinfo != NULL)
uifree(cr->cr_uidinfo);
if (cr->cr_ruidinfo != NULL)
@@ -1766,7 +1765,6 @@ crfree(struct ucred *cr)
mac_destroy_cred(cr);
#endif
FREE(cr, M_CRED);
- mtx_unlock(&Giant);
} else {
mtx_unlock(mtxp);
}
OpenPOWER on IntegriCloud