[PATCH 0/3] Support negative dentry cache for FUSE and virtiofs

From: Keiichi Watanabe
Date: Tue Jun 20 2023 - 11:14:42 EST



This patch series adds a new mount option called negative_dentry_timeout
for FUSE and virtio-fs filesystems. This option allows the kernel to cache
negative dentries, which are dentries that represent a non-existent file.
When this option is enabled, the kernel will skip FUSE_LOOKUP requests for
second and subsequent lookups to a non-existent file.

Unlike negative dentry caches on a normal filesystem such as ext4, the
kernel may need to refresh the cache for FUSE and virtio-fs filesystems.
This is because the kernel does not know when a FUSE server or a virtio-fs
device creates or deletes files. To address this, the new
negative_dentry_timeout option takes an expiration time for cache entries.
The appropriate timeout duration should be determined by considering how
often a FUSE server updates file paths and the amount of memory the kernel
can use for the cache.

As we evaluated the virtio-fs's performance on a guest Linux on crosvm
[1]'s virtiofs device[2], the `negative_dentry_timeout` option saved ~1
second per 10000 `stat` call against a non-existent path. The experiment
settings and results are as follows:

* Command to start VM with crosvm:
sudo crosvm run \
--disable-sandbox \
--cpus 1 \
--mem 2048 \
--rwroot debian.img \
--shared-dir \
/path/:my_virtiofs:type=fs:cache=always:timeout=3600 \
-p "console=hvc0 init=/bin/bash" \
vmlinux

* Mount command in the guest
Default:
$ mount -t virtiofs my_virtiofs ./workspace/
With negative dentry cache:
$ mount -t virtiofs -o negative_dentry_timeout=10 my_virtiofs ./workspace/

* Test commands
$ cd workspace
$ echo 3 > /proc/sys/vm/drop_caches
$ time for i in `seq 1 10000`; \
do stat non-existent.txt 2> /dev/null; \
done

* Results:
Default:
real 0m12.606s
user 0m3.624s
sys 0m7.756s

With `-o negative_dentry_timeout=10`:
real 0m11.276s
user 0m3.514s
sys 0m7.544s

[1]: https://crosvm.dev/book/
[2]: https://crosvm.dev/book/devices/fs.html


Keiichi Watanabe (3):
docs: virtiofs: Fix descriptions about virtiofs mount option
fuse: Add negative_dentry_timeout option
virtiofs: Add negative_dentry_timeout option

Documentation/filesystems/dax.rst | 1 +
Documentation/filesystems/fuse.rst | 6 ++++++
Documentation/filesystems/virtiofs.rst | 9 ++++++++-
fs/fuse/dir.c | 3 ++-
fs/fuse/fuse_i.h | 4 ++++
fs/fuse/inode.c | 12 +++++++++++-
fs/fuse/virtio_fs.c | 8 ++++++++
7 files changed, 40 insertions(+), 3 deletions(-)

--
2.41.0.185.g7c58973941-goog