svn commit: r325263 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Wed Nov 1 05:51:22 UTC 2017


Author: mjg
Date: Wed Nov  1 05:51:20 2017
New Revision: 325263
URL: https://svnweb.freebsd.org/changeset/base/325263

Log:
  Save on uihash table locking by checking if the caller already uses the struct
  
  In particular with poudriere this saves about 90% of lookups.

Modified:
  head/sys/kern/init_main.c
  head/sys/kern/kern_resource.c

Modified: head/sys/kern/init_main.c
==============================================================================
--- head/sys/kern/init_main.c	Wed Nov  1 03:54:07 2017	(r325262)
+++ head/sys/kern/init_main.c	Wed Nov  1 05:51:20 2017	(r325263)
@@ -420,6 +420,7 @@ proc0_init(void *dummy __unused)
 	struct proc *p;
 	struct thread *td;
 	struct ucred *newcred;
+	struct uidinfo tmpuinfo;
 	vm_paddr_t pageablemem;
 	int i;
 
@@ -502,8 +503,14 @@ proc0_init(void *dummy __unused)
 	/* Create credentials. */
 	newcred = crget();
 	newcred->cr_ngroups = 1;	/* group 0 */
+	/* A hack to prevent uifind from tripping over NULL pointers. */
+	curthread->td_ucred = newcred;
+	tmpuinfo.ui_uid = 1;
+	newcred->cr_uidinfo = newcred->cr_ruidinfo = &tmpuinfo;
 	newcred->cr_uidinfo = uifind(0);
 	newcred->cr_ruidinfo = uifind(0);
+	/* End hack. creds get properly set later with thread_cow_get_proc */
+	curthread->td_ucred = NULL;
 	newcred->cr_prison = &prison0;
 	newcred->cr_loginclass = loginclass_find("default");
 	proc_set_cred_init(p, newcred);

Modified: head/sys/kern/kern_resource.c
==============================================================================
--- head/sys/kern/kern_resource.c	Wed Nov  1 03:54:07 2017	(r325262)
+++ head/sys/kern/kern_resource.c	Wed Nov  1 05:51:20 2017	(r325263)
@@ -1253,6 +1253,18 @@ struct uidinfo *
 uifind(uid_t uid)
 {
 	struct uidinfo *new_uip, *uip;
+	struct ucred *cred;
+
+	cred = curthread->td_ucred;
+	if (cred->cr_uidinfo->ui_uid == uid) {
+		uip = cred->cr_uidinfo;
+		uihold(uip);
+		return (uip);
+	} else if (cred->cr_ruidinfo->ui_uid == uid) {
+		uip = cred->cr_ruidinfo;
+		uihold(uip);
+		return (uip);
+	}
 
 	rw_rlock(&uihashtbl_lock);
 	uip = uilookup(uid);


More information about the svn-src-all mailing list