make buffer size match kernel max transfer size
authorCarlos Maiolino <cmaiolino-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Thu, 20 Apr 2017 12:53:01 +0000 (14:53 +0200)
committerNikolaus Rath <Nikolaus@rath.org>
Thu, 20 Apr 2017 16:22:30 +0000 (09:22 -0700)
Currently libfuse has a hardcoded buffer limit to 128kib, while fuse
kernel module has a limit up to 32 pages.

This patch changes buffer limit to match the current page size, instead
of assuming 4096 bytes pages, enabling architectures with bigger pages
to use larger buffers, improving performance.

Also, add a new macro (HEADER_SIZE) to specify the space needed to
accommodate the header, making it easier to understand why those extra
4096 bytes are needed

Signed-off-by: Carlos Maiolino <cmaiolino-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
lib/fuse_lowlevel.c

index a960123e18d77c82288ecf405c05b6dad301b47b..1ece58c9436992d551006c3f48fba514f7e4183c 100644 (file)
@@ -2767,7 +2767,10 @@ restart:
        return res;
 }
 
-#define MIN_BUFSIZE 0x21000
+#define KERNEL_BUF_PAGES 32
+
+/* room needed in buffer to accommodate header */
+#define HEADER_SIZE 0x1000
 
 struct fuse_session *fuse_session_new(struct fuse_args *args,
                                      const struct fuse_lowlevel_ops *op,
@@ -2829,8 +2832,7 @@ struct fuse_session *fuse_session_new(struct fuse_args *args,
        if (se->debug)
                fprintf(stderr, "FUSE library version: %s\n", PACKAGE_VERSION);
 
-       se->bufsize = getpagesize() + 0x1000;
-       se->bufsize = se->bufsize < MIN_BUFSIZE ? MIN_BUFSIZE : se->bufsize;
+       se->bufsize = KERNEL_BUF_PAGES * getpagesize() + HEADER_SIZE;
 
        list_init_req(&se->list);
        list_init_req(&se->interrupts);