Reallocate fuse_session buffer transparently for extended max writes
authorJoanne Koong <joannelkoong@gmail.com>
Fri, 15 Nov 2024 04:55:48 +0000 (20:55 -0800)
committerBernd Schubert <bernd.schubert@fastmail.fm>
Thu, 21 Nov 2024 18:18:03 +0000 (19:18 +0100)
commit0e0f43b79b9b3e746f2d4c6b96294b8a954c6708
treec2bbaa94eef525ba3762819c34b9900b0e25b792
parent49f74c9b93e9a3a4127a5f43583f64513c2254fd
Reallocate fuse_session buffer transparently for extended max writes

A previous PR supported extended max writes (eg write requests larger than 1 MB)
by initializing the fuse session buffer size to use the max_pages_limit set in
/proc/sys/fs/fuse. However, this is a huge problem for machines where multiple
fuse servers may be running but only one server needs large writes. In this case,
a lot of memory will be wasted and will lead to OOM issues.

This PR does a reallocation of the session buffer transparently if the server set
 "se->conn.max_write" to a value larger than 1 MiB. This is only for buffers that
are "owned" by libfuse - if the server wishes to provide its own allocated buffer
for receiving/processing requests, then it should ensure that buffer is allocated
to the proper size from the start.

Local testing showed:
echo 65535 | sudo tee /proc/sys/fs/fuse/max_pages_limit
dd if=/dev/urandom of=hello_file bs=6M count=2

write requests:
write request size is 5242880
write request size is 1048576
write request size is 5242880
write request size is 1048576
include/fuse_common.h
lib/fuse_i.h
lib/fuse_lowlevel.c