Author: mjg
Date: Mon Aug 10 12:05:55 2020
New Revision: 364079
URL: https://svnweb.freebsd.org/changeset/base/364079

Log:
  cache: resize struct namecache to a multiply of alignment
  
  For example struct namecache on amd64 is 100 bytes, but it has to occupies
  104. Use the extra bytes to support longer names.

Modified:
  head/sys/kern/vfs_cache.c

Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c   Mon Aug 10 11:51:56 2020        (r364078)
+++ head/sys/kern/vfs_cache.c   Mon Aug 10 12:05:55 2020        (r364079)
@@ -159,7 +159,18 @@ struct     namecache_ts {
  * alignment for everyone. Note this is a nop for 64-bit platforms.
  */
 #define CACHE_ZONE_ALIGNMENT   UMA_ALIGNOF(time_t)
+#define        CACHE_PATH_CUTOFF       39
 
+#define CACHE_ZONE_SMALL_SIZE          (sizeof(struct namecache) + 
CACHE_PATH_CUTOFF + 1)
+#define CACHE_ZONE_SMALL_TS_SIZE       (sizeof(struct namecache_ts) + 
CACHE_PATH_CUTOFF + 1)
+#define CACHE_ZONE_LARGE_SIZE          (sizeof(struct namecache) + NAME_MAX + 
1)
+#define CACHE_ZONE_LARGE_TS_SIZE       (sizeof(struct namecache_ts) + NAME_MAX 
+ 1)
+
+_Static_assert((CACHE_ZONE_SMALL_SIZE % (CACHE_ZONE_ALIGNMENT + 1)) == 0, "bad 
zone size");
+_Static_assert((CACHE_ZONE_SMALL_TS_SIZE % (CACHE_ZONE_ALIGNMENT + 1)) == 0, 
"bad zone size");
+_Static_assert((CACHE_ZONE_LARGE_SIZE % (CACHE_ZONE_ALIGNMENT + 1)) == 0, "bad 
zone size");
+_Static_assert((CACHE_ZONE_LARGE_TS_SIZE % (CACHE_ZONE_ALIGNMENT + 1)) == 0, 
"bad zone size");
+
 #define        nc_vp           n_un.nu_vp
 #define        nc_neg          n_un.nu_neg
 
@@ -339,8 +350,6 @@ static uma_zone_t __read_mostly cache_zone_small_ts;
 static uma_zone_t __read_mostly cache_zone_large;
 static uma_zone_t __read_mostly cache_zone_large_ts;
 
-#define        CACHE_PATH_CUTOFF       35
-
 static struct namecache *
 cache_alloc(int len, int ts)
 {
@@ -2095,22 +2104,14 @@ nchinit(void *dummy __unused)
 {
        u_int i;
 
-       cache_zone_small = uma_zcreate("S VFS Cache",
-           sizeof(struct namecache) + CACHE_PATH_CUTOFF + 1,
-           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT,
-           UMA_ZONE_ZINIT);
-       cache_zone_small_ts = uma_zcreate("STS VFS Cache",
-           sizeof(struct namecache_ts) + CACHE_PATH_CUTOFF + 1,
-           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT,
-           UMA_ZONE_ZINIT);
-       cache_zone_large = uma_zcreate("L VFS Cache",
-           sizeof(struct namecache) + NAME_MAX + 1,
-           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT,
-           UMA_ZONE_ZINIT);
-       cache_zone_large_ts = uma_zcreate("LTS VFS Cache",
-           sizeof(struct namecache_ts) + NAME_MAX + 1,
-           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT,
-           UMA_ZONE_ZINIT);
+       cache_zone_small = uma_zcreate("S VFS Cache", CACHE_ZONE_SMALL_SIZE,
+           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT, UMA_ZONE_ZINIT);
+       cache_zone_small_ts = uma_zcreate("STS VFS Cache", 
CACHE_ZONE_SMALL_TS_SIZE,
+           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT, UMA_ZONE_ZINIT);
+       cache_zone_large = uma_zcreate("L VFS Cache", CACHE_ZONE_LARGE_SIZE,
+           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT, UMA_ZONE_ZINIT);
+       cache_zone_large_ts = uma_zcreate("LTS VFS Cache", 
CACHE_ZONE_LARGE_TS_SIZE,
+           NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT, UMA_ZONE_ZINIT);
 
        VFS_SMR_ZONE_SET(cache_zone_small);
        VFS_SMR_ZONE_SET(cache_zone_small_ts);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to