Module Name:    src
Committed By:   snj
Date:           Tue Nov  1 19:49:04 UTC 2016

Modified Files:
        src/lib/libperfuse [netbsd-7]: fuse.h libperfuse.3 perfuse.c
            perfuse_if.h
        src/usr.sbin/perfused [netbsd-7]: msg.c perfused.8

Log Message:
Pull up following revision(s) (requested by manu in ticket #1266):
        lib/libperfuse/fuse.h: revision 1.7
        lib/libperfuse/libperfuse.3: revision 1.4, 1.5
        lib/libperfuse/perfuse.c: revision 1.38-1.40
        lib/libperfuse/perfuse_if.h: revision 1.21, 1.22
        usr.sbin/perfused/msg.c: revision 1.23, 1.24
        usr.sbin/perfused/perfused.8: revision 1.12
Make FUSE socket buffer tunable
When dealing with high I/O throughput, we could run out of buffer
space if the filesystem was not consuming requests fast enough.
Here we slightly raise the buffer size, and we make it tunable
through the PERFUSE_BUFSIZE environment variable so that we can
cope with higher requirement later.
While there, document PERFUSE_OPTIONS environment variable.
--
make this compile again, and simplify.
--
Sort sections. new sentence, new line. Whitespace.
--
make the env stuff visible.
--
remove dup function


To generate a diff of this commit:
cvs rdiff -u -r1.5.18.1 -r1.5.18.2 src/lib/libperfuse/fuse.h
cvs rdiff -u -r1.3 -r1.3.22.1 src/lib/libperfuse/libperfuse.3
cvs rdiff -u -r1.31.10.5 -r1.31.10.6 src/lib/libperfuse/perfuse.c
cvs rdiff -u -r1.20 -r1.20.10.1 src/lib/libperfuse/perfuse_if.h
cvs rdiff -u -r1.21.10.1 -r1.21.10.2 src/usr.sbin/perfused/msg.c
cvs rdiff -u -r1.11 -r1.11.18.1 src/usr.sbin/perfused/perfused.8

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libperfuse/fuse.h
diff -u src/lib/libperfuse/fuse.h:1.5.18.1 src/lib/libperfuse/fuse.h:1.5.18.2
--- src/lib/libperfuse/fuse.h:1.5.18.1	Wed Nov  5 18:11:30 2014
+++ src/lib/libperfuse/fuse.h	Tue Nov  1 19:49:04 2016
@@ -1,4 +1,4 @@
-/*  $NetBSD: fuse.h,v 1.5.18.1 2014/11/05 18:11:30 snj Exp $ */
+/*  $NetBSD: fuse.h,v 1.5.18.2 2016/11/01 19:49:04 snj Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -34,8 +34,8 @@
 #define FUSE_UNKNOWN_FH (uint64_t)0
 
 #ifndef FUSE_BUFSIZE
-#define FUSE_MIN_BUFSIZE 0x21000
-#define FUSE_PREF_BUFSIZE (sysconf(_SC_PAGESIZE) + 0x1000)
+#define FUSE_MIN_BUFSIZE ((size_t)0x21000)
+#define FUSE_PREF_BUFSIZE ((size_t)(sysconf(_SC_PAGESIZE) + 0x1000))
 #define FUSE_BUFSIZE MAX(FUSE_PREF_BUFSIZE /* CONSTCOND */, FUSE_MIN_BUFSIZE)
 #endif /* FUSE_BUFSIZE */
 

Index: src/lib/libperfuse/libperfuse.3
diff -u src/lib/libperfuse/libperfuse.3:1.3 src/lib/libperfuse/libperfuse.3:1.3.22.1
--- src/lib/libperfuse/libperfuse.3:1.3	Tue May 10 12:14:37 2011
+++ src/lib/libperfuse/libperfuse.3	Tue Nov  1 19:49:04 2016
@@ -1,4 +1,4 @@
-.\" $NetBSD: libperfuse.3,v 1.3 2011/05/10 12:14:37 njoly Exp $
+.\" $NetBSD: libperfuse.3,v 1.3.22.1 2016/11/01 19:49:04 snj Exp $
 .\"
 .\" Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
 .\"
@@ -105,6 +105,22 @@ handles control to the regular
 returns a file descriptor to the
 .Pa /dev/fuse
 socket on success, and causes exit on failure.
+.Sh ENVIRONMENT
+.Bl -tag -width Er
+.It Ev PERFUSE_OPTIONS
+Comma-separated values controlling the usage of some FUSE methods.
+Allowed values are
+.Li enable_access ,
+.Li disable_access ,
+.Li enable_creat ,
+.Li disable_creat .
+.It Ev PERFUSE_BUFSIZE
+Set the socket buffer sizes used for communication with the filesystem.
+This should be raised as operation throughput requires it.
+Default is
+.Li 2162688
+bytes, which is enough to queue 16 FUSE packets of maximum 132 kB length.
+.El
 .\".Sh ERRORS
 .\".Fn perfuse_mount
 .\"will fail when one of the following occurs:

Index: src/lib/libperfuse/perfuse.c
diff -u src/lib/libperfuse/perfuse.c:1.31.10.5 src/lib/libperfuse/perfuse.c:1.31.10.6
--- src/lib/libperfuse/perfuse.c:1.31.10.5	Thu Aug  6 21:52:13 2015
+++ src/lib/libperfuse/perfuse.c	Tue Nov  1 19:49:04 2016
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse.c,v 1.31.10.5 2015/08/06 21:52:13 snj Exp $ */
+/*  $NetBSD: perfuse.c,v 1.31.10.6 2016/11/01 19:49:04 snj Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -32,6 +32,7 @@
 #include <string.h>
 #include <errno.h>
 #include <puffs.h>
+#include <inttypes.h>
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/resource.h>
@@ -52,7 +53,6 @@ extern char **environ;
 static struct perfuse_state *init_state(void);
 static int get_fd(const char *);
 
-
 static struct perfuse_state *
 init_state(void)
 {
@@ -146,6 +146,25 @@ get_fd(const char *data)
 
 }
 
+uint32_t 
+perfuse_bufvar_from_env(const char *name, uint32_t defval)
+{
+	char valstr[1024];
+	int e;
+	uint32_t retval;
+
+	if (getenv_r(name, valstr, sizeof(valstr)) == -1)
+		return defval;
+
+	retval = (uint32_t)strtoi(valstr, NULL, 0, 0, UINT32_MAX, &e);
+	if (!e)
+		return retval;
+
+	DWARNC(e, "conversion from `%s' to uint32_t failed, using %u",
+	    valstr, defval);
+	return defval;
+}
+
 int
 perfuse_open(const char *path, int flags, mode_t mode)
 {
@@ -180,10 +199,11 @@ perfuse_open(const char *path, int flags
 	}
 
 	/*
-	 * Set a buffer lentgh large enough so that any FUSE packet
+	 * Set a buffer lentgh large enough so that enough FUSE packets
 	 * will fit.
 	 */
-	opt = (uint32_t)FUSE_BUFSIZE;
+	opt = perfuse_bufvar_from_env("PERFUSE_BUFSIZE",
+	    (uint32_t)(16 * FUSE_BUFSIZE));
 	optlen = sizeof(opt);
 	if (setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &opt, optlen) != 0)
 		DWARN("%s: setsockopt SO_SNDBUF to %d failed", __func__, opt);
@@ -211,10 +231,11 @@ perfuse_open(const char *path, int flags
 	}
 
 	/*
-	 * Set a buffer lentgh large enough so that any FUSE packet
+	 * Set a buffer lentgh large enough so that enough FUSE packets
 	 * will fit.
 	 */
-	opt = (uint32_t)(4 * FUSE_BUFSIZE);
+	opt = perfuse_bufvar_from_env("PERFUSE_BUFSIZE",
+	    (uint32_t)(16 * FUSE_BUFSIZE));
 	optlen = sizeof(opt);
 	if (setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &opt, optlen) != 0)
 		DWARN("%s: setsockopt SO_SNDBUF to %d failed", __func__, opt);

Index: src/lib/libperfuse/perfuse_if.h
diff -u src/lib/libperfuse/perfuse_if.h:1.20 src/lib/libperfuse/perfuse_if.h:1.20.10.1
--- src/lib/libperfuse/perfuse_if.h:1.20	Sat Jul 21 05:49:42 2012
+++ src/lib/libperfuse/perfuse_if.h	Tue Nov  1 19:49:04 2016
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse_if.h,v 1.20 2012/07/21 05:49:42 manu Exp $ */
+/*  $NetBSD: perfuse_if.h,v 1.20.10.1 2016/11/01 19:49:04 snj Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -103,13 +103,20 @@ extern int perfuse_diagflags;
 } while (0 /* CONSTCOND */)
 
 #define DWARN(fmt, ...) do {						\
-									\
 	if (perfuse_diagflags & PDF_SYSLOG) 				\
 		syslog(LOG_WARNING, fmt ": %m", ## __VA_ARGS__);	\
 									\
 	warn(fmt, ## __VA_ARGS__);					\
 } while (0 /* CONSTCOND */)
 
+#define DWARNC(e, fmt, ...) do {					\
+	if (perfuse_diagflags & PDF_SYSLOG) { 				\
+		errno = e;						\
+		syslog(LOG_WARNING, fmt ": %m", ## __VA_ARGS__);	\
+	}								\
+	warnc(e, fmt, ## __VA_ARGS__);					\
+} while (0 /* CONSTCOND */)
+
 /*
  * frame handling callbacks
  */
@@ -212,5 +219,6 @@ int perfuse_mainloop(struct puffs_usermo
 int perfuse_unmount(struct puffs_usermount *);
 void perfuse_trace_dump(struct puffs_usermount *, FILE *);
 void perfuse_fsreq(struct puffs_usermount *, perfuse_msg_t *);
+uint32_t perfuse_bufvar_from_env(const char *, uint32_t);
 
 #endif /* _PERFUSE_IF_H */

Index: src/usr.sbin/perfused/msg.c
diff -u src/usr.sbin/perfused/msg.c:1.21.10.1 src/usr.sbin/perfused/msg.c:1.21.10.2
--- src/usr.sbin/perfused/msg.c:1.21.10.1	Sun Aug 24 08:42:06 2014
+++ src/usr.sbin/perfused/msg.c	Tue Nov  1 19:49:04 2016
@@ -1,4 +1,4 @@
-/*  $NetBSD: msg.c,v 1.21.10.1 2014/08/24 08:42:06 martin Exp $ */
+/*  $NetBSD: msg.c,v 1.21.10.2 2016/11/01 19:49:04 snj Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -80,15 +80,13 @@ perfused_open_sock(void)
 	/*
 	 * Set a buffer lentgh large enough so that a few FUSE packets
 	 * will fit. 
-	 * XXX We will have to find how many packets we need
 	 */
-	opt = 4 * FUSE_BUFSIZE;
+	opt = perfuse_bufvar_from_env("PERFUSE_BUFSIZE", 16 * FUSE_BUFSIZE);
 	if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)) != 0)
-		DWARN("%s: setsockopt SO_SNDBUF to %d failed", __func__, opt);
+		DWARN("%s: setsockopt SO_SNDBUF = %d failed", __func__, opt);
 
-	opt = 4 * FUSE_BUFSIZE;
 	if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) != 0)
-		DWARN("%s: setsockopt SO_RCVBUF to %d failed", __func__, opt);
+		DWARN("%s: setsockopt SO_RCVBUF = %d failed", __func__, opt);
 
 	/*
 	 * Request peer credentials

Index: src/usr.sbin/perfused/perfused.8
diff -u src/usr.sbin/perfused/perfused.8:1.11 src/usr.sbin/perfused/perfused.8:1.11.18.1
--- src/usr.sbin/perfused/perfused.8:1.11	Sun Jan 29 11:32:23 2012
+++ src/usr.sbin/perfused/perfused.8	Tue Nov  1 19:49:04 2016
@@ -1,4 +1,4 @@
-.\" $NetBSD: perfused.8,v 1.11 2012/01/29 11:32:23 wiz Exp $
+.\" $NetBSD: perfused.8,v 1.11.18.1 2016/11/01 19:49:04 snj Exp $
 .\"
 .\" Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
 .\"
@@ -118,6 +118,12 @@ is started from
 Enable debug output only when receiving
 .Li SIGINFO .
 .El
+.Sh ENVIRONMENT
+See
+.Xr libperfuse 3
+for environment variables affecting
+.Nm
+behavior.
 .Sh SIGNALS
 .Bl -tag -width indent
 .It Dv SIGINFO

Reply via email to