From: Mitsuo H. <mit...@hi...> - 2012-07-05 10:55:49
|
The sysfs parameter /sys/fs/fuse/max_pages_per_req indicates the current maximum request size. So, the minimum buffer size per mount should be changed according to it. If not, the libfuse must always set it to maximum request limit (= [256 pages * 4KB + 0x1000] in current implementation), which leads to waste of memory. Signed-off-by: Mitsuo Hayasaka <mit...@hi...> Cc: Miklos Szeredi <mi...@sz...> --- lib/fuse_kern_chan.c | 22 +++++++++++++++++++++- 1 files changed, 21 insertions(+), 1 deletions(-) diff --git a/lib/fuse_kern_chan.c b/lib/fuse_kern_chan.c index 5f77bbf..44b6593 100644 --- a/lib/fuse_kern_chan.c +++ b/lib/fuse_kern_chan.c @@ -81,6 +81,25 @@ static void fuse_kern_chan_destroy(struct fuse_chan *ch) } #define MIN_BUFSIZE 0x21000 +#define FUSE_MAXPAGES_PATH "/sys/fs/fuse/max_pages_per_req" + +static unsigned int fuse_read_max_pages(void) +{ + int res; + unsigned int max_pages; + unsigned int min_bufsize; + FILE *f; + + f = fopen(FUSE_MAXPAGES_PATH, "r"); + if (!f) + return MIN_BUFSIZE; + res = fscanf(f, "%u", &max_pages); + fclose(f); + if (res != 1) + return MIN_BUFSIZE; + min_bufsize = max_pages * getpagesize() + 0x1000; + return min_bufsize < MIN_BUFSIZE ? MIN_BUFSIZE : min_bufsize; +} struct fuse_chan *fuse_kern_chan_new(int fd) { @@ -90,6 +109,7 @@ struct fuse_chan *fuse_kern_chan_new(int fd) .destroy = fuse_kern_chan_destroy, }; size_t bufsize = getpagesize() + 0x1000; - bufsize = bufsize < MIN_BUFSIZE ? MIN_BUFSIZE : bufsize; + unsigned int min_bufsize = fuse_read_max_pages(); + bufsize = bufsize < min_bufsize ? min_bufsize : bufsize; return fuse_chan_new(&op, fd, bufsize, NULL); } |