svn commit: r274122 - in head/sys: kern sys

Mateusz Guzik mjg at FreeBSD.org
Wed Nov 5 02:08:38 UTC 2014


Author: mjg
Date: Wed Nov  5 02:08:37 2014
New Revision: 274122
URL: https://svnweb.freebsd.org/changeset/base/274122

Log:
  Extend struct ucred with group table.
  
  This saves one malloc + free with typical cases and better utilizes
  memory.
  
  Submitted by:	Tiwei Bie <btw mail.ustc.edu.cn> (slightly modified)
  X-Additional:	JuniorJobs project

Modified:
  head/sys/kern/kern_prot.c
  head/sys/sys/ucred.h

Modified: head/sys/kern/kern_prot.c
==============================================================================
--- head/sys/kern/kern_prot.c	Wed Nov  5 01:57:32 2014	(r274121)
+++ head/sys/kern/kern_prot.c	Wed Nov  5 02:08:37 2014	(r274122)
@@ -1817,7 +1817,9 @@ crget(void)
 #ifdef MAC
 	mac_cred_init(cr);
 #endif
-	crextend(cr, XU_NGROUPS);
+	cr->cr_groups = cr->cr_smallgroups;
+	cr->cr_agroups =
+	    sizeof(cr->cr_smallgroups) / sizeof(cr->cr_smallgroups[0]);
 	return (cr);
 }
 
@@ -1864,7 +1866,8 @@ crfree(struct ucred *cr)
 #ifdef MAC
 		mac_cred_destroy(cr);
 #endif
-		free(cr->cr_groups, M_CRED);
+		if (cr->cr_groups != cr->cr_smallgroups)
+			free(cr->cr_groups, M_CRED);
 		free(cr, M_CRED);
 	}
 }
@@ -1997,7 +2000,7 @@ crextend(struct ucred *cr, int n)
 		cnt = roundup2(n, PAGE_SIZE / sizeof(gid_t));
 
 	/* Free the old array. */
-	if (cr->cr_groups)
+	if (cr->cr_groups != cr->cr_smallgroups)
 		free(cr->cr_groups, M_CRED);
 
 	cr->cr_groups = malloc(cnt * sizeof(gid_t), M_CRED, M_WAITOK | M_ZERO);

Modified: head/sys/sys/ucred.h
==============================================================================
--- head/sys/sys/ucred.h	Wed Nov  5 01:57:32 2014	(r274121)
+++ head/sys/sys/ucred.h	Wed Nov  5 02:08:37 2014	(r274122)
@@ -37,6 +37,8 @@
 
 struct loginclass;
 
+#define	XU_NGROUPS	16
+
 /*
  * Credentials.
  *
@@ -64,13 +66,12 @@ struct ucred {
 	struct auditinfo_addr	cr_audit;	/* Audit properties. */
 	gid_t	*cr_groups;		/* groups */
 	int	cr_agroups;		/* Available groups */
+	gid_t   cr_smallgroups[XU_NGROUPS];	/* storage for small groups */
 };
 #define	NOCRED	((struct ucred *)0)	/* no credential available */
 #define	FSCRED	((struct ucred *)-1)	/* filesystem credential */
 #endif /* _KERNEL || _WANT_UCRED */
 
-#define	XU_NGROUPS	16
-
 /*
  * Flags for cr_flags.
  */


More information about the svn-src-all mailing list