[Devel] [PATCH RHEL9 COMMIT] fs/fuse: add some options to request routing
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Jan 23 21:53:25 MSK 2025
The commit is pushed to "branch-rh9-5.14.0-427.44.1.vz9.80.x-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh9-5.14.0-427.44.1.vz9.80.4
------>
commit 603f9f5f6915f6462b0aaba7e0653e8578047cca
Author: Alexey Kuznetsov <kuznet at virtuozzo.com>
Date: Sat Jan 18 02:09:28 2025 +0800
fs/fuse: add some options to request routing
Routing is not 100% good, we have situations when we
need to adapt its behaviour to current io profile.
Of course, it must be automatic, but at the moment
we are still not sure what the rules really should be.
So, for now add some handles to change routing behaviour,
they will allow us to test correct choices in various scenarios.
Signed-off-by: Alexey Kuznetsov <kuznet at virtuozzo.com>
Feature: vStorage
---
fs/fuse/file.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 2112dcf2fa0a..4b701af5a205 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -23,6 +23,15 @@
#include <linux/file.h>
#include <linux/jhash.h>
+unsigned int hash_seed_r;
+module_param(hash_seed_r, uint, 0644);
+unsigned int hash_seed_w;
+module_param(hash_seed_w, uint, 0644);
+unsigned int read_route_break;
+module_param(read_route_break, uint, 0644);
+unsigned int write_route_break;
+module_param(write_route_break, uint, 0644);
+
unsigned int relax_fallocate = 1;
module_param(relax_fallocate, uint, 0644);
@@ -799,7 +808,7 @@ struct fuse_iqueue *fuse_route_io(struct fuse_conn *fc, struct fuse_rtable *rt,
return fiq;
break;
case FUSE_ROUTING_HASH:
- i = jhash_1word((u32)inode->i_ino, 0) % rt->rt_size;
+ i = jhash_1word((u32)inode->i_ino, hash_seed_r) % rt->rt_size;
fiq = rt->iqs_table + i;
if (fiq->handled_by_fud)
return fiq;
@@ -809,7 +818,8 @@ struct fuse_iqueue *fuse_route_io(struct fuse_conn *fc, struct fuse_rtable *rt,
return NULL;
for (i = 0; i < rt->rt_size; i += rt->divisor) {
- fiq = rt->iqs_table + i + (jhash_1word((u32)inode->i_ino, 0) % rt->divisor);
+ fiq = rt->iqs_table + i +
+ (jhash_1word((u32)inode->i_ino, hash_seed_w) % rt->divisor);
if (iosize <= fiq->size && fiq->handled_by_fud)
return fiq;
}
@@ -838,7 +848,7 @@ void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos,
args->out_args[0].size = count;
args->io_inode = file_inode(file);
- if (opcode == FUSE_READ) {
+ if (opcode == FUSE_READ && count >= read_route_break) {
args->fiq = fuse_route_io(ff->fm->fc, &ff->fm->fc->rrt, count, args->io_inode);
args->inode = file->f_path.dentry->d_inode;
args->ff = ff;
@@ -1349,7 +1359,8 @@ static void fuse_write_args_fill(struct fuse_io_args *ia, struct fuse_file *ff,
args->io_inode = inode;
args->ff = ff;
- args->fiq = fuse_route_io(ff->fm->fc, &ff->fm->fc->wrt, count, inode);
+ if (count >= write_route_break)
+ args->fiq = fuse_route_io(ff->fm->fc, &ff->fm->fc->wrt, count, inode);
}
static unsigned int fuse_write_flags(struct kiocb *iocb)
@@ -2036,7 +2047,8 @@ __acquires(fi->lock)
args->force = true;
args->nocreds = true;
- args->fiq = fuse_route_io(fm->fc, &fm->fc->wrt, inarg->size, wpa->inode);
+ if (inarg->size >= write_route_break)
+ args->fiq = fuse_route_io(fm->fc, &fm->fc->wrt, inarg->size, wpa->inode);
spin_unlock(&fi->lock);
err = fuse_simple_background(fm, args, GFP_NOFS | __GFP_NOFAIL);
More information about the Devel
mailing list