From cef8c8b249023fb8129ae791e0998cbca771f96a Mon Sep 17 00:00:00 2001 From: yangyun50 <149988609+yangyun50@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:50:48 +0800 Subject: Add support for no_interrupt (#956) The function fuse_session_process_buf_int() would do much things for FUSE_INTERRUPT requests, even there are no FUSE_INTERRUPT requests: 1. check every non-FUSE_INTERRUPT request and add these requests to the linked list(se->list) under a big lock(se->lock). 2. the function fuse_free_req() frees every request and remove them from the linked list(se->list) under a bing lock(se->lock). These operations are not meaningful when there are no FUSE_INTERRUPT requests, and have a great impact on the performance of fuse filesystem because the big lock for each request. In some cases, FUSE_INTERRUPT requests are infrequent, even none at all. Besides, the user-defined filesystem may do nothing for FUSE_INTERRUPT requests. And the kernel side has the option "no_interrupt" in struct fuse_conn. This kernel option can be enabled by return ENOSYS in libfuse for the reply of FUSE_INTERRUPT request. But I don't find the code to enable the "no_interrupt" kernel option in libfuse. So add the no_interrupt support, and when this operaion is enabled: 1. remove the useless locking operaions and list operations. 2. return ENOSYS for the reply of FUSE_INTERRUPT request to inform the kernel to disable FUSE_INTERRUPT request. --- example/notify_inval_inode.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'example/notify_inval_inode.c') diff --git a/example/notify_inval_inode.c b/example/notify_inval_inode.c index c0b1112..de88c87 100644 --- a/example/notify_inval_inode.c +++ b/example/notify_inval_inode.c @@ -123,6 +123,13 @@ static int tfs_stat(fuse_ino_t ino, struct stat *stbuf) { return 0; } +static void tfs_init(void *userdata, struct fuse_conn_info *conn) { + (void)userdata; + + /* Disable the receiving and processing of FUSE_INTERRUPT requests */ + conn->no_interrupt = 1; +} + static void tfs_destroy(void *userarg) { (void)userarg; @@ -250,6 +257,7 @@ static void tfs_read(fuse_req_t req, fuse_ino_t ino, size_t size, } static const struct fuse_lowlevel_ops tfs_oper = { + .init = tfs_init, .destroy = tfs_destroy, .lookup = tfs_lookup, .getattr = tfs_getattr, -- cgit v1.2.3