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.
  */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to