aboutsummaryrefslogtreecommitdiffstats
path: root/example/cuse.c
diff options
context:
space:
mode:
authoryangyun50 <149988609+yangyun50@users.noreply.github.com>2024-06-04 19:50:48 +0800
committerGitHub <noreply@github.com>2024-06-04 13:50:48 +0200
commitcef8c8b249023fb8129ae791e0998cbca771f96a (patch)
treef7e335bb6fe30feadaef0cac05c23fcb957f79ab /example/cuse.c
parent949944ff3bde50d62f98b0cab15cef2959d40a2d (diff)
downloadlibfuse-cef8c8b249023fb8129ae791e0998cbca771f96a.tar.gz
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.
Diffstat (limited to 'example/cuse.c')
-rw-r--r--example/cuse.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/example/cuse.c b/example/cuse.c
index 0c0e7bc..6b33302 100644
--- a/example/cuse.c
+++ b/example/cuse.c
@@ -87,6 +87,14 @@ static int cusexmp_expand(size_t new_size)
return 0;
}
+static void cusexmp_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 cusexmp_open(fuse_req_t req, struct fuse_file_info *fi)
{
fuse_reply_open(req, fi);
@@ -281,6 +289,7 @@ static int cusexmp_process_arg(void *data, const char *arg, int key,
}
static const struct cuse_lowlevel_ops cusexmp_clop = {
+ .init = cusexmp_init,
.open = cusexmp_open,
.read = cusexmp_read,
.write = cusexmp_write,