Author: mjg Date: Sun Aug 2 20:02:06 2020 New Revision: 363782 URL: https://svnweb.freebsd.org/changeset/base/363782
Log: vfs: store precomputed namecache hash in the vnode This significantly speeds up path lookup, Cascade Lake doing access(2) on ufs on /usr/obj/usr/src/amd64.amd64/sys/GENERIC/vnode_if.c, ops/s: before: 2535298 after: 2797621 Over +10%. The reversed order of computation here does not seem to matter for hash distribution. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D25921 Modified: head/sys/kern/vfs_cache.c Modified: head/sys/kern/vfs_cache.c ============================================================================== --- head/sys/kern/vfs_cache.c Sun Aug 2 20:00:43 2020 (r363781) +++ head/sys/kern/vfs_cache.c Sun Aug 2 20:02:06 2020 (r363782) @@ -490,14 +490,22 @@ cache_assert_vnode_locked(struct vnode *vp) cache_assert_vlp_locked(vlp); } +/* + * TODO: With the value stored we can do better than computing the hash based + * on the address and the choice of FNV should also be revisisted. + */ +static void +cache_prehash(struct vnode *vp) +{ + + vp->v_nchash = fnv_32_buf(&vp, sizeof(vp), FNV1_32_INIT); +} + static uint32_t cache_get_hash(char *name, u_char len, struct vnode *dvp) { - uint32_t hash; - hash = fnv_32_buf(name, len, FNV1_32_INIT); - hash = fnv_32_buf(&dvp, sizeof(dvp), hash); - return (hash); + return (fnv_32_buf(name, len, dvp->v_nchash)); } static inline struct rwlock * @@ -2077,6 +2085,7 @@ cache_vnode_init(struct vnode *vp) LIST_INIT(&vp->v_cache_src); TAILQ_INIT(&vp->v_cache_dst); vp->v_cache_dd = NULL; + cache_prehash(vp); } void _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"