mirror of
https://github.com/libfuse/libfuse.git
synced 2024-11-23 04:04:31 +08:00
Initialize session buffer size to value set by sysctl
Currently in libfuse, the buffer size for a fuse session is capped at 1 MiB on a 4k page system. A recent patch upstream [1] was merged that allows the max number of pages per fuse request to be dynamically configurable through the /proc/sys interface (/proc/sys/fs/fuse/max_pages_limit). This commit adds support for this on the libfuse side to set the fuse session buffer to take into account the max pages limit set in /proc/sys/fs/fuse/max_pages_limit. If this sysctl does not exist (eg older kernels), it will default to old behavior (using FUSE_MAX_MAX_PAGES (256) as the max pages limit). This allows for things like bigger write buffers per request. [1] https://lore.kernel.org/linux-fsdevel/20240923171311.1561917-1-joannelkoong@gmail.com/T/#t
This commit is contained in:
parent
d637fe6f3e
commit
78eeae60bb
@ -2907,6 +2907,29 @@ static void fuse_ll_pipe_destructor(void *data)
|
||||
fuse_ll_pipe_free(llp);
|
||||
}
|
||||
|
||||
static unsigned int get_max_pages(void)
|
||||
{
|
||||
char buf[32];
|
||||
int res;
|
||||
int fd;
|
||||
|
||||
fd = open("/proc/sys/fs/fuse/max_pages_limit", O_RDONLY);
|
||||
if (fd < 0)
|
||||
return FUSE_MAX_MAX_PAGES;
|
||||
|
||||
res = read(fd, buf, sizeof(buf) - 1);
|
||||
|
||||
close(fd);
|
||||
|
||||
if (res < 0)
|
||||
return FUSE_MAX_MAX_PAGES;
|
||||
|
||||
buf[res] = '\0';
|
||||
|
||||
res = strtol(buf, NULL, 10);
|
||||
return res < 0 ? FUSE_MAX_MAX_PAGES : res;
|
||||
}
|
||||
|
||||
int fuse_session_receive_buf(struct fuse_session *se, struct fuse_buf *buf)
|
||||
{
|
||||
return fuse_session_receive_buf_int(se, buf, NULL);
|
||||
@ -3142,7 +3165,7 @@ struct fuse_session *_fuse_session_new_317(struct fuse_args *args,
|
||||
if (se->debug)
|
||||
fuse_log(FUSE_LOG_DEBUG, "FUSE library version: %s\n", PACKAGE_VERSION);
|
||||
|
||||
se->bufsize = FUSE_MAX_MAX_PAGES * getpagesize() +
|
||||
se->bufsize = get_max_pages() * getpagesize() +
|
||||
FUSE_BUFFER_HEADER_SIZE;
|
||||
|
||||
list_init_req(&se->list);
|
||||
|
Loading…
Reference in New Issue
Block a user