Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Jun 2019 16:30:25 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r349462 - in projects/fuse2: share/man/man5 sys/fs/fuse
Message-ID:  <201906271630.x5RGUPLA012288@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Thu Jun 27 16:30:25 2019
New Revision: 349462
URL: https://svnweb.freebsd.org/changeset/base/349462

Log:
  fusefs: convert statistical sysctls to use counter(9)
  
  counter(9) is more performant than using atomic instructions to update
  sysctls that just report statistics to userland.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/fuse2/share/man/man5/fusefs.5
  projects/fuse2/sys/fs/fuse/fuse.h
  projects/fuse2/sys/fs/fuse/fuse_file.c
  projects/fuse2/sys/fs/fuse/fuse_file.h
  projects/fuse2/sys/fs/fuse/fuse_internal.c
  projects/fuse2/sys/fs/fuse/fuse_internal.h
  projects/fuse2/sys/fs/fuse/fuse_ipc.c
  projects/fuse2/sys/fs/fuse/fuse_main.c
  projects/fuse2/sys/fs/fuse/fuse_node.c
  projects/fuse2/sys/fs/fuse/fuse_node.h
  projects/fuse2/sys/fs/fuse/fuse_vnops.c

Modified: projects/fuse2/share/man/man5/fusefs.5
==============================================================================
--- projects/fuse2/share/man/man5/fusefs.5	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/share/man/man5/fusefs.5	Thu Jun 27 16:30:25 2019	(r349462)
@@ -28,7 +28,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD$
-.Dd June 26, 2019
+.Dd June 27, 2019
 .Dt FUSEFS 5
 .Os
 .Sh NAME
@@ -60,11 +60,9 @@ Finally, the
 API is portable.
 Many daemons can run on multiple operating systems with minimal modifications.
 .Sh SYSCTL VARIABLES
-The following variables are available as both
+The following 
 .Xr sysctl 8
-variables and
-.Xr loader 8
-tunables:
+variables are available:
 .Bl -tag -width indent
 .It Va vfs.fusefs.kernelabi_major
 Major version of the FUSE kernel ABI supported by this driver.
@@ -87,14 +85,19 @@ require network access.
 .Pp
 FUSE file systems using protocol 7.23 or later specify their cache behavior
 on a per-mountpoint basis, ignoring this sysctl.
+.It Va vfs.fusefs.stats.filehandle_count
+Current number of open FUSE file handles.
+.It Va vfs.fusefs.stats.lookup_cache_hits
+Total number of lookup cache hits.
+.It Va vfs.fusefs.stats.lookup_cache_misses
+Total number of lookup cache misses.
+.It Va vfs.fusefs.stats.node_count
+Current number of allocated FUSE vnodes.
+.It Va vfs.fusefs.stats.ticket_count
+Current number of allocated FUSE tickets, which is roughly equal to the number
+number of FUSE operations currently being processed by daemons.
 .\" Undocumented sysctls
 .\" ====================
-.\" Counters: I intend to rename to vfs.fusefs.stats.* for clarity
-.\" vfs.fusefs.lookup_cache_{hits, misses}
-.\" vfs.fusefs.filehandle_count
-.\" vfs.fusefs.ticker_count
-.\" vfs.fusefs.node_count
-.\"
 .\" vfs.fusefs.reclaim_revoked: I don't understand it well-enough
 .\" vfs.fusefs.enforce_dev_perms: I don't understand it well enough.
 .\" vfs.fusefs.iov_credit: I don't understand it well enough

Modified: projects/fuse2/sys/fs/fuse/fuse.h
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse.h	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse.h	Thu Jun 27 16:30:25 2019	(r349462)
@@ -66,6 +66,7 @@
 /* misc */
 
 SYSCTL_DECL(_vfs_fusefs);
+SYSCTL_DECL(_vfs_fusefs_stats);
 
 /* Fuse locking */
 

Modified: projects/fuse2/sys/fs/fuse/fuse_file.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_file.c	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_file.c	Thu Jun 27 16:30:25 2019	(r349462)
@@ -59,6 +59,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/counter.h>
 #include <sys/module.h>
 #include <sys/systm.h>
 #include <sys/errno.h>
@@ -93,10 +94,10 @@ SDT_PROVIDER_DECLARE(fusefs);
  */
 SDT_PROBE_DEFINE2(fusefs, , file, trace, "int", "char*");
 
-static int fuse_fh_count = 0;
+static counter_u64_t fuse_fh_count = 0;
 
-SYSCTL_INT(_vfs_fusefs, OID_AUTO, filehandle_count, CTLFLAG_RD,
-    &fuse_fh_count, 0, "number of open FUSE filehandles");
+SYSCTL_COUNTER_U64(_vfs_fusefs_stats, OID_AUTO, filehandle_count, CTLFLAG_RD,
+    &fuse_fh_count, "number of open FUSE filehandles");
 
 /* Get the FUFH type for a particular access mode */
 static inline fufh_type_t
@@ -190,7 +191,7 @@ fuse_filehandle_close(struct vnode *vp, struct fuse_fi
 	fdisp_destroy(&fdi);
 
 out:
-	atomic_subtract_acq_int(&fuse_fh_count, 1);
+	counter_u64_add(fuse_fh_count, -1);
 	LIST_REMOVE(fufh, next);
 	free(fufh, M_FUSE_FILEHANDLE);
 
@@ -343,7 +344,7 @@ fuse_filehandle_init(struct vnode *vp, fufh_type_t fuf
 	if (fufhp != NULL)
 		*fufhp = fufh;
 
-	atomic_add_acq_int(&fuse_fh_count, 1);
+	counter_u64_add(fuse_fh_count, 1);
 
 	if (foo->open_flags & FOPEN_DIRECT_IO) {
 		ASSERT_VOP_ELOCKED(vp, __func__);
@@ -355,4 +356,17 @@ fuse_filehandle_init(struct vnode *vp, fufh_type_t fuf
 	        VTOFUD(vp)->flag &= ~FN_DIRECTIO;
 	}
 
+}
+
+void
+fuse_file_init(void)
+{
+	fuse_fh_count = counter_u64_alloc(M_WAITOK);
+	counter_u64_zero(fuse_fh_count);
+}
+
+void
+fuse_file_destroy(void)
+{
+	counter_u64_free(fuse_fh_count);
 }

Modified: projects/fuse2/sys/fs/fuse/fuse_file.h
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_file.h	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_file.h	Thu Jun 27 16:30:25 2019	(r349462)
@@ -213,4 +213,7 @@ int fuse_filehandle_open(struct vnode *vp, int mode,
 int fuse_filehandle_close(struct vnode *vp, struct fuse_filehandle *fufh,
                           struct thread *td, struct ucred *cred);
 
+void fuse_file_init(void);
+void fuse_file_destroy(void);
+
 #endif /* _FUSE_FILE_H_ */

Modified: projects/fuse2/sys/fs/fuse/fuse_internal.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_internal.c	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_internal.c	Thu Jun 27 16:30:25 2019	(r349462)
@@ -59,6 +59,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/counter.h>
 #include <sys/module.h>
 #include <sys/systm.h>
 #include <sys/errno.h>
@@ -107,6 +108,15 @@ static int isbzero(void *buf, size_t len);
 
 #endif
 
+counter_u64_t fuse_lookup_cache_hits = 0;
+counter_u64_t fuse_lookup_cache_misses = 0;
+
+SYSCTL_COUNTER_U64(_vfs_fusefs_stats, OID_AUTO, lookup_cache_hits, CTLFLAG_RD,
+    &fuse_lookup_cache_hits, "number of positive cache hits in lookup");
+
+SYSCTL_COUNTER_U64(_vfs_fusefs_stats, OID_AUTO, lookup_cache_misses, CTLFLAG_RD,
+    &fuse_lookup_cache_misses, "number of cache misses in lookup");
+
 int
 fuse_internal_get_cached_vnode(struct mount* mp, ino_t ino, int flags,
 	struct vnode **vpp)
@@ -130,11 +140,11 @@ fuse_internal_get_cached_vnode(struct mount* mp, ino_t
 	if (*vpp != NULL) {
 		getbinuptime(&now);
 		if (bintime_cmp(&(VTOFUD(*vpp)->entry_cache_timeout), &now, >)){
-			atomic_add_acq_long(&fuse_lookup_cache_hits, 1);
+			counter_u64_add(fuse_lookup_cache_hits, 1);
 			return 0;
 		} else {
 			/* Entry cache timeout */
-			atomic_add_acq_long(&fuse_lookup_cache_misses, 1);
+			counter_u64_add(fuse_lookup_cache_misses, 1);
 			cache_purge(*vpp);
 			vput(*vpp);
 			*vpp = NULL;
@@ -1157,3 +1167,19 @@ isbzero(void *buf, size_t len)
 }
 
 #endif
+
+void
+fuse_internal_init(void)
+{
+	fuse_lookup_cache_misses = counter_u64_alloc(M_WAITOK);
+	counter_u64_zero(fuse_lookup_cache_misses);
+	fuse_lookup_cache_hits = counter_u64_alloc(M_WAITOK);
+	counter_u64_zero(fuse_lookup_cache_hits);
+}
+
+void
+fuse_internal_destroy(void)
+{
+	counter_u64_free(fuse_lookup_cache_hits);
+	counter_u64_free(fuse_lookup_cache_misses);
+}

Modified: projects/fuse2/sys/fs/fuse/fuse_internal.h
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_internal.h	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_internal.h	Thu Jun 27 16:30:25 2019	(r349462)
@@ -61,6 +61,7 @@
 #define _FUSE_INTERNAL_H_
 
 #include <sys/types.h>
+#include <sys/counter.h>
 #include <sys/uio.h>
 #include <sys/stat.h>
 #include <sys/vnode.h>
@@ -68,8 +69,8 @@
 #include "fuse_ipc.h"
 #include "fuse_node.h"
 
-extern u_long fuse_lookup_cache_hits;
-extern u_long fuse_lookup_cache_misses;
+extern counter_u64_t fuse_lookup_cache_hits;
+extern counter_u64_t fuse_lookup_cache_misses;
 
 static inline bool
 vfs_isrdonly(struct mount *mp)
@@ -311,5 +312,9 @@ void fuse_internal_forget_send(struct mount *mp, struc
 
 int fuse_internal_init_callback(struct fuse_ticket *tick, struct uio *uio);
 void fuse_internal_send_init(struct fuse_data *data, struct thread *td);
+
+/* module load/unload */
+void fuse_internal_init(void);
+void fuse_internal_destroy(void);
 
 #endif /* _FUSE_INTERNAL_H_ */

Modified: projects/fuse2/sys/fs/fuse/fuse_ipc.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_ipc.c	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_ipc.c	Thu Jun 27 16:30:25 2019	(r349462)
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/module.h>
 #include <sys/systm.h>
+#include <sys/counter.h>
 #include <sys/errno.h>
 #include <sys/kernel.h>
 #include <sys/conf.h>
@@ -107,11 +108,10 @@ static int fuse_body_audit(struct fuse_ticket *ftick, 
 
 static fuse_handler_t fuse_standard_handler;
 
-SYSCTL_NODE(_vfs, OID_AUTO, fusefs, CTLFLAG_RW, 0, "FUSE tunables");
-static int fuse_ticket_count = 0;
+static counter_u64_t fuse_ticket_count;
+SYSCTL_COUNTER_U64(_vfs_fusefs_stats, OID_AUTO, ticket_count, CTLFLAG_RD,
+    &fuse_ticket_count, "Number of allocated tickets");
 
-SYSCTL_INT(_vfs_fusefs, OID_AUTO, ticket_count, CTLFLAG_RW,
-    &fuse_ticket_count, 0, "number of allocated tickets");
 static long fuse_iov_permanent_bufsize = 1 << 19;
 
 SYSCTL_LONG(_vfs_fusefs, OID_AUTO, iov_permanent_bufsize, CTLFLAG_RW,
@@ -326,7 +326,7 @@ fticket_ctor(void *mem, int size, void *arg, int flags
 	ftick->irq_unique = 0;
 
 	refcount_init(&ftick->tk_refcount, 1);
-	atomic_add_acq_int(&fuse_ticket_count, 1);
+	counter_u64_add(fuse_ticket_count, 1);
 
 	return 0;
 }
@@ -341,7 +341,7 @@ fticket_dtor(void *mem, int size, void *arg)
 	FUSE_ASSERT_MS_DONE(ftick);
 	FUSE_ASSERT_AW_DONE(ftick);
 
-	atomic_subtract_acq_int(&fuse_ticket_count, 1);
+	counter_u64_add(fuse_ticket_count, -1);
 }
 
 static int
@@ -1075,10 +1075,13 @@ fuse_ipc_init(void)
 	ticket_zone = uma_zcreate("fuse_ticket", sizeof(struct fuse_ticket),
 	    fticket_ctor, fticket_dtor, fticket_init, fticket_fini,
 	    UMA_ALIGN_PTR, 0);
+	fuse_ticket_count = counter_u64_alloc(M_WAITOK);
+	counter_u64_zero(fuse_ticket_count);
 }
 
 void
 fuse_ipc_destroy(void)
 {
+	counter_u64_free(fuse_ticket_count);
 	uma_zdestroy(ticket_zone);
 }

Modified: projects/fuse2/sys/fs/fuse/fuse_main.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_main.c	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_main.c	Thu Jun 27 16:30:25 2019	(r349462)
@@ -77,6 +77,10 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysctl.h>
 
 #include "fuse.h"
+#include "fuse_file.h"
+#include "fuse_ipc.h"
+#include "fuse_internal.h"
+#include "fuse_node.h"
 
 static void fuse_bringdown(eventhandler_tag eh_tag);
 static int fuse_loader(struct module *m, int what, void *arg);
@@ -97,6 +101,8 @@ static struct vfsconf fuse_vfsconf = {
 	.vfc_flags = VFCF_JAIL | VFCF_SYNTHETIC
 };
 
+SYSCTL_NODE(_vfs, OID_AUTO, fusefs, CTLFLAG_RW, 0, "FUSE tunables");
+SYSCTL_NODE(_vfs_fusefs, OID_AUTO, stats, CTLFLAG_RW, 0, "FUSE statistics");
 SYSCTL_INT(_vfs_fusefs, OID_AUTO, kernelabi_major, CTLFLAG_RD,
     SYSCTL_NULL_INT_PTR, FUSE_KERNEL_VERSION, "FUSE kernel abi major version");
 SYSCTL_INT(_vfs_fusefs, OID_AUTO, kernelabi_minor, CTLFLAG_RD,
@@ -112,7 +118,9 @@ SDT_PROVIDER_DEFINE(fusefs);
 static void
 fuse_bringdown(eventhandler_tag eh_tag)
 {
-
+	fuse_node_destroy();
+	fuse_internal_destroy();
+	fuse_file_destroy();
 	fuse_ipc_destroy();
 	fuse_device_destroy();
 	mtx_destroy(&fuse_mtx);
@@ -133,6 +141,9 @@ fuse_loader(struct module *m, int what, void *arg)
 			return (err);
 		}
 		fuse_ipc_init();
+		fuse_file_init();
+		fuse_internal_init();
+		fuse_node_init();
 		fuse_pbuf_zone = pbuf_zsecond_create("fusepbuf", nswbuf / 2);
 
 		/* vfs_modevent ignores its first arg */

Modified: projects/fuse2/sys/fs/fuse/fuse_node.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_node.c	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_node.c	Thu Jun 27 16:30:25 2019	(r349462)
@@ -59,6 +59,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <sys/counter.h>
 #include <sys/module.h>
 #include <sys/systm.h>
 #include <sys/errno.h>
@@ -101,10 +102,10 @@ MALLOC_DEFINE(M_FUSEVN, "fuse_vnode", "fuse vnode priv
 
 static int sysctl_fuse_cache_mode(SYSCTL_HANDLER_ARGS);
 
-static int fuse_node_count = 0;
+static counter_u64_t fuse_node_count;
 
-SYSCTL_INT(_vfs_fusefs, OID_AUTO, node_count, CTLFLAG_RD,
-    &fuse_node_count, 0, "Count of FUSE vnodes");
+SYSCTL_COUNTER_U64(_vfs_fusefs_stats, OID_AUTO, node_count, CTLFLAG_RD,
+    &fuse_node_count, "Count of FUSE vnodes");
 
 int	fuse_data_cache_mode = FUSE_CACHE_WT;
 
@@ -158,7 +159,7 @@ fuse_vnode_init(struct vnode *vp, struct fuse_vnode_da
 	vp->v_type = vtyp;
 	vp->v_data = fvdat;
 
-	atomic_add_acq_int(&fuse_node_count, 1);
+	counter_u64_add(fuse_node_count, 1);
 }
 
 void
@@ -171,7 +172,7 @@ fuse_vnode_destroy(struct vnode *vp)
 		("Destroying fuse vnode with open files!"));
 	free(fvdat, M_FUSEVN);
 
-	atomic_subtract_acq_int(&fuse_node_count, 1);
+	counter_u64_add(fuse_node_count, -1);
 }
 
 int
@@ -479,4 +480,17 @@ fuse_vnode_update(struct vnode *vp, int flags)
 		fvdat->cached_attrs.va_ctime = ts;
 	
 	fvdat->flag |= flags;
+}
+
+void
+fuse_node_init(void)
+{
+	fuse_node_count = counter_u64_alloc(M_WAITOK);
+	counter_u64_zero(fuse_node_count);
+}
+
+void
+fuse_node_destroy(void)
+{
+	counter_u64_free(fuse_node_count);
 }

Modified: projects/fuse2/sys/fs/fuse/fuse_node.h
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_node.h	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_node.h	Thu Jun 27 16:30:25 2019	(r349462)
@@ -191,4 +191,7 @@ int fuse_vnode_setsize(struct vnode *vp, off_t newsize
 void fuse_vnode_undirty_cached_timestamps(struct vnode *vp);
 
 void fuse_vnode_update(struct vnode *vp, int flags);
+
+void fuse_node_init(void);
+void fuse_node_destroy(void);
 #endif /* _FUSE_NODE_H_ */

Modified: projects/fuse2/sys/fs/fuse/fuse_vnops.c
==============================================================================
--- projects/fuse2/sys/fs/fuse/fuse_vnops.c	Thu Jun 27 15:51:50 2019	(r349461)
+++ projects/fuse2/sys/fs/fuse/fuse_vnops.c	Thu Jun 27 16:30:25 2019	(r349462)
@@ -218,16 +218,6 @@ struct vop_vector fuse_vnops = {
 	.vop_vptofh = fuse_vnop_vptofh,
 };
 
-u_long fuse_lookup_cache_hits = 0;
-
-SYSCTL_ULONG(_vfs_fusefs, OID_AUTO, lookup_cache_hits, CTLFLAG_RD,
-    &fuse_lookup_cache_hits, 0, "number of positive cache hits in lookup");
-
-u_long fuse_lookup_cache_misses = 0;
-
-SYSCTL_ULONG(_vfs_fusefs, OID_AUTO, lookup_cache_misses, CTLFLAG_RD,
-    &fuse_lookup_cache_misses, 0, "number of cache misses in lookup");
-
 /*
  * XXX: This feature is highly experimental and can bring to instabilities,
  * needs revisiting before to be enabled by default.
@@ -1048,11 +1038,10 @@ fuse_vnop_lookup(struct vop_lookup_args *ap)
 		switch (err) {
 		case -1:		/* positive match */
 			if (timespeccmp(&timeout, &now, >)) {
-				atomic_add_acq_long(&fuse_lookup_cache_hits, 1);
+				counter_u64_add(fuse_lookup_cache_hits, 1);
 			} else {
 				/* Cache timeout */
-				atomic_add_acq_long(&fuse_lookup_cache_misses,
-					1);
+				counter_u64_add(fuse_lookup_cache_misses, 1);
 				bintime_clear(
 					&VTOFUD(*vpp)->entry_cache_timeout);
 				cache_purge(*vpp);
@@ -1066,7 +1055,7 @@ fuse_vnop_lookup(struct vop_lookup_args *ap)
 			return 0;
 
 		case 0:		/* no match in cache */
-			atomic_add_acq_long(&fuse_lookup_cache_misses, 1);
+			counter_u64_add(fuse_lookup_cache_misses, 1);
 			break;
 
 		case ENOENT:		/* negative match */



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