Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Oct 2025 01:25:01 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Mateusz Guzik <mjg@freebsd.org>
Cc:        src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org
Subject:   Re: git: 84f981ba57e7 - main - nullfs: shrink null_node to 32 bytes
Message-ID:  <aORBvZz9pEKf9bns@kib.kiev.ua>
In-Reply-To: <202510061823.596IN7oZ084715@gitrepo.freebsd.org>
References:  <202510061823.596IN7oZ084715@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Oct 06, 2025 at 06:23:07PM +0000, Mateusz Guzik wrote:
> The branch main has been updated by mjg:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=84f981ba57e77bd3c3d0fbf1469ce51bfd132a6b
> 
> commit 84f981ba57e77bd3c3d0fbf1469ce51bfd132a6b
> Author:     Mateusz Guzik <mjg@FreeBSD.org>
> AuthorDate: 2025-10-06 17:59:17 +0000
> Commit:     Mateusz Guzik <mjg@FreeBSD.org>
> CommitDate: 2025-10-06 18:23:01 +0000
> 
>     nullfs: shrink null_node to 32 bytes
> ---
>  sys/fs/nullfs/null.h      |  2 +-
>  sys/fs/nullfs/null_subr.c | 12 +++++++-----
>  2 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/sys/fs/nullfs/null.h b/sys/fs/nullfs/null.h
> index aa7a689bec34..ad3f7779e108 100644
> --- a/sys/fs/nullfs/null.h
> +++ b/sys/fs/nullfs/null.h
> @@ -53,7 +53,7 @@ struct null_mount {
>   * A cache of vnode references
>   */
>  struct null_node {
> -	CK_LIST_ENTRY(null_node) null_hash;	/* Hash list */
> +	CK_SLIST_ENTRY(null_node) null_hash;	/* Hash list */
>  	struct vnode	        *null_lowervp;	/* VREFed once */
>  	struct vnode		*null_vnode;	/* Back pointer */
>  	u_int			null_flags;
> diff --git a/sys/fs/nullfs/null_subr.c b/sys/fs/nullfs/null_subr.c
> index ad8cd08279cc..bb0ff9966dfd 100644
> --- a/sys/fs/nullfs/null_subr.c
> +++ b/sys/fs/nullfs/null_subr.c
> @@ -59,7 +59,7 @@ VFS_SMR_DECLARE;
>  
>  #define	NULL_NHASH(vp) (&null_node_hashtbl[vfs_hash_index(vp) & null_hash_mask])
>  
> -static CK_LIST_HEAD(null_node_hashhead, null_node) *null_node_hashtbl;
> +static CK_SLIST_HEAD(null_node_hashhead, null_node) *null_node_hashtbl;
>  static struct rwlock null_hash_lock;
>  static u_long null_hash_mask;
>  
> @@ -116,7 +116,7 @@ null_hashget_locked(struct mount *mp, struct vnode *lowervp)
>  	 * reference count (but NOT the lower vnode's VREF counter).
>  	 */
>  	hd = NULL_NHASH(lowervp);
> -	CK_LIST_FOREACH(a, hd, null_hash) {
> +	CK_SLIST_FOREACH(a, hd, null_hash) {
>  		if (a->null_lowervp != lowervp)
>  			continue;
>  		/*
> @@ -148,7 +148,7 @@ null_hashget(struct mount *mp, struct vnode *lowervp)
>  
>  	vfs_smr_enter();
>  	hd = NULL_NHASH(lowervp);
> -	CK_LIST_FOREACH(a, hd, null_hash) {
> +	CK_SLIST_FOREACH(a, hd, null_hash) {
>  		if (a->null_lowervp != lowervp)
>  			continue;
>  		/*
> @@ -189,7 +189,7 @@ null_hashins(struct mount *mp, struct null_node *xp)
>  		}
>  	}
>  #endif
> -	CK_LIST_INSERT_HEAD(hd, xp, null_hash);
> +	CK_SLIST_INSERT_HEAD(hd, xp, null_hash);
>  }
>  
>  static void
> @@ -305,9 +305,11 @@ null_nodeget(struct mount *mp, struct vnode *lowervp, struct vnode **vpp)
>  void
>  null_hashrem(struct null_node *xp)
>  {
> +	struct null_node_hashhead *hd;
>  
> +	hd = NULL_NHASH(xp->null_lowervp);
>  	rw_wlock(&null_hash_lock);
> -	CK_LIST_REMOVE(xp, null_hash);
> +	CK_SLIST_REMOVE(hd, xp, null_node, null_hash);
This changes O(1) removal into O(N), for N being the size of the hash
chain length for specific hash.  I.e. it is on par with the lookup.

Why it is fine?  Why it was not mentioned and explained in the commit
message?

>  	rw_wunlock(&null_hash_lock);
>  }
>  



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?aORBvZz9pEKf9bns>