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