aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2020-08-05 09:24:38 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2020-08-05 09:24:38 +0000
commitcf8ac0de81506bd040b64f4c5fbe96c3109f802b (patch)
treef06ed7ff9d1f7244248e261eb4d11643ab21a7bc
parentd61ce7ef50c770c20bcc8698209e331e51c59a70 (diff)
Notes
-rw-r--r--sys/kern/vfs_cache.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 252984849d90..fd8c36b07403 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -122,9 +122,9 @@ _Static_assert(sizeof(struct negstate) <= sizeof(struct vnode *),
"the state must fit in a union with a pointer without growing it");
struct namecache {
- CK_LIST_ENTRY(namecache) nc_hash;/* hash chain */
LIST_ENTRY(namecache) nc_src; /* source vnode list */
TAILQ_ENTRY(namecache) nc_dst; /* destination vnode list */
+ CK_LIST_ENTRY(namecache) nc_hash;/* hash chain */
struct vnode *nc_dvp; /* vnode of parent of name */
union {
struct vnode *nu_vp; /* vnode the name refers to */
@@ -142,6 +142,8 @@ struct namecache {
* to be stored. The nc_dotdottime field is used when a cache entry is mapping
* both a non-dotdot directory name plus dotdot for the directory's
* parent.
+ *
+ * See below for alignment requirement.
*/
struct namecache_ts {
struct timespec nc_time; /* timespec provided by fs */
@@ -150,6 +152,14 @@ struct namecache_ts {
struct namecache nc_nc;
};
+/*
+ * At least mips n32 performs 64-bit accesses to timespec as found
+ * in namecache_ts and requires them to be aligned. Since others
+ * may be in the same spot suffer a little bit and enforce the
+ * alignment for everyone. Note this is a nop for 64-bit platforms.
+ */
+#define CACHE_ZONE_ALIGNMENT UMA_ALIGNOF(time_t)
+
#define nc_vp n_un.nu_vp
#define nc_neg n_un.nu_neg
@@ -2053,19 +2063,19 @@ nchinit(void *dummy __unused)
cache_zone_small = uma_zcreate("S VFS Cache",
sizeof(struct namecache) + CACHE_PATH_CUTOFF + 1,
- NULL, NULL, NULL, NULL, UMA_ALIGNOF(struct namecache),
+ 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, UMA_ALIGNOF(struct namecache_ts),
+ 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, UMA_ALIGNOF(struct namecache),
+ 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, UMA_ALIGNOF(struct namecache_ts),
+ NULL, NULL, NULL, NULL, CACHE_ZONE_ALIGNMENT,
UMA_ZONE_ZINIT);
VFS_SMR_ZONE_SET(cache_zone_small);