From: Bernd Schubert <[email protected]>
To: Miklos Szeredi <[email protected]>,
Amir Goldstein <[email protected]>,
[email protected],
Bernd Schubert <[email protected]>,
[email protected]
Cc: [email protected]
Subject: [PATCH RFC v2 19/19] fuse: {uring} Optimize async sends
Date: Wed, 29 May 2024 20:00:54 +0200 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
This is to avoid using async completion tasks
(i.e. context switches) when not needed.
Cc: [email protected]
Signed-off-by: Bernd Schubert <[email protected]>
---
This condition should be better verified by io-uring developers.
} else if (current->io_uring) {
/* There are two cases here
* 1) fuse-server side uses multiple threads accessing
* the ring
* 2) IO requests through io-uring
*/
send_in_task = true;
issue_flags = 0;
---
fs/fuse/dev_uring.c | 57 ++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 46 insertions(+), 11 deletions(-)
diff --git a/fs/fuse/dev_uring.c b/fs/fuse/dev_uring.c
index cdc5836edb6e..74407e5e86fa 100644
--- a/fs/fuse/dev_uring.c
+++ b/fs/fuse/dev_uring.c
@@ -32,7 +32,8 @@
#include <linux/io_uring/cmd.h>
static void fuse_uring_req_end_and_get_next(struct fuse_ring_ent *ring_ent,
- bool set_err, int error);
+ bool set_err, int error,
+ unsigned int issue_flags);
static void fuse_ring_ring_ent_unset_userspace(struct fuse_ring_ent *ent)
{
@@ -682,7 +683,9 @@ static int fuse_uring_copy_to_ring(struct fuse_ring *ring, struct fuse_req *req,
* userspace will read it
* This is comparable with classical read(/dev/fuse)
*/
-static void fuse_uring_send_to_ring(struct fuse_ring_ent *ring_ent)
+static void fuse_uring_send_to_ring(struct fuse_ring_ent *ring_ent,
+ unsigned int issue_flags,
+ bool send_in_task)
{
struct fuse_ring *ring = ring_ent->queue->ring;
struct fuse_ring_req *rreq = ring_ent->rreq;
@@ -723,13 +726,16 @@ static void fuse_uring_send_to_ring(struct fuse_ring_ent *ring_ent)
__func__, ring_ent->queue->qid, ring_ent->tag, ring_ent->state,
rreq->in.opcode, rreq->in.unique);
- io_uring_cmd_complete_in_task(ring_ent->cmd,
- fuse_uring_async_send_to_ring);
+ if (send_in_task)
+ io_uring_cmd_complete_in_task(ring_ent->cmd,
+ fuse_uring_async_send_to_ring);
+ else
+ io_uring_cmd_done(ring_ent->cmd, 0, 0, issue_flags);
return;
err:
- fuse_uring_req_end_and_get_next(ring_ent, true, err);
+ fuse_uring_req_end_and_get_next(ring_ent, true, err, issue_flags);
}
/*
@@ -806,7 +812,8 @@ static bool fuse_uring_ent_release_and_fetch(struct fuse_ring_ent *ring_ent)
* has lock/unlock/lock to avoid holding the lock on calling fuse_request_end
*/
static void fuse_uring_req_end_and_get_next(struct fuse_ring_ent *ring_ent,
- bool set_err, int error)
+ bool set_err, int error,
+ unsigned int issue_flags)
{
struct fuse_req *req = ring_ent->fuse_req;
int has_next;
@@ -822,7 +829,7 @@ static void fuse_uring_req_end_and_get_next(struct fuse_ring_ent *ring_ent,
has_next = fuse_uring_ent_release_and_fetch(ring_ent);
if (has_next) {
/* called within uring context - use provided flags */
- fuse_uring_send_to_ring(ring_ent);
+ fuse_uring_send_to_ring(ring_ent, issue_flags, false);
}
}
@@ -857,7 +864,7 @@ static void fuse_uring_commit_and_release(struct fuse_dev *fud,
out:
pr_devel("%s:%d ret=%zd op=%d req-ret=%d\n", __func__, __LINE__, err,
req->args->opcode, req->out.h.error);
- fuse_uring_req_end_and_get_next(ring_ent, set_err, err);
+ fuse_uring_req_end_and_get_next(ring_ent, set_err, err, issue_flags);
}
/*
@@ -1156,10 +1163,12 @@ int fuse_uring_queue_fuse_req(struct fuse_conn *fc, struct fuse_req *req)
struct fuse_ring_queue *queue;
struct fuse_ring_ent *ring_ent = NULL;
int res;
- int async = test_bit(FR_BACKGROUND, &req->flags) &&
- !req->args->async_blocking;
+ int async_req = test_bit(FR_BACKGROUND, &req->flags);
+ int async = async_req && !req->args->async_blocking;
struct list_head *ent_queue, *req_queue;
int qid;
+ bool send_in_task;
+ unsigned int issue_flags;
qid = fuse_uring_get_req_qid(req, ring, async);
queue = fuse_uring_get_queue(ring, qid);
@@ -1182,11 +1191,37 @@ int fuse_uring_queue_fuse_req(struct fuse_conn *fc, struct fuse_req *req)
list_first_entry(ent_queue, struct fuse_ring_ent, list);
list_del(&ring_ent->list);
fuse_uring_add_req_to_ring_ent(ring_ent, req);
+ if (current == queue->server_task) {
+ issue_flags = queue->uring_cmd_issue_flags;
+ } else if (current->io_uring) {
+ /* There are two cases here
+ * 1) fuse-server side uses multiple threads accessing
+ * the ring. We only have stored issue_flags for
+ * into the queue for one thread (the first one
+ * that submits FUSE_URING_REQ_FETCH)
+ * 2) IO requests through io-uring, we do not have
+ * issue flags at all for these
+ */
+ send_in_task = true;
+ issue_flags = 0;
+ } else {
+ if (async_req) {
+ /*
+ * page cache writes might hold an upper
+ * spinlockl, which conflicts with the io-uring
+ * mutex
+ */
+ send_in_task = true;
+ issue_flags = 0;
+ } else {
+ issue_flags = IO_URING_F_UNLOCKED;
+ }
+ }
}
spin_unlock(&queue->lock);
if (ring_ent != NULL)
- fuse_uring_send_to_ring(ring_ent);
+ fuse_uring_send_to_ring(ring_ent, issue_flags, send_in_task);
return 0;
--
2.40.1
next prev parent reply other threads:[~2024-05-29 18:35 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-29 18:00 [PATCH RFC v2 00/19] fuse: fuse-over-io-uring Bernd Schubert
2024-05-29 18:00 ` Bernd Schubert [this message]
2024-05-31 16:24 ` [PATCH RFC v2 19/19] fuse: {uring} Optimize async sends Jens Axboe
2024-05-31 17:36 ` Bernd Schubert
2024-05-31 19:10 ` Jens Axboe
2024-06-01 16:37 ` Bernd Schubert
2024-05-30 7:07 ` [PATCH RFC v2 00/19] fuse: fuse-over-io-uring Amir Goldstein
2024-05-30 12:09 ` Bernd Schubert
2024-05-30 15:36 ` Kent Overstreet
2024-05-30 16:02 ` Bernd Schubert
2024-05-30 16:10 ` Kent Overstreet
2024-05-30 16:17 ` Bernd Schubert
2024-05-30 17:30 ` Kent Overstreet
2024-05-30 19:09 ` Josef Bacik
2024-05-30 20:05 ` Kent Overstreet
2024-05-31 3:53 ` [PATCH] fs: sys_ringbuffer() (WIP) Kent Overstreet
2024-05-31 13:11 ` kernel test robot
2024-05-31 15:49 ` kernel test robot
2024-05-30 16:21 ` [PATCH RFC v2 00/19] fuse: fuse-over-io-uring Jens Axboe
2024-05-30 16:32 ` Bernd Schubert
2024-05-30 17:26 ` Jens Axboe
2024-05-30 17:16 ` Kent Overstreet
2024-05-30 17:28 ` Jens Axboe
2024-05-30 17:58 ` Kent Overstreet
2024-05-30 18:48 ` Jens Axboe
2024-05-30 19:35 ` Kent Overstreet
2024-05-31 0:11 ` Jens Axboe
2024-06-04 23:45 ` Ming Lei
2024-05-30 20:47 ` Josef Bacik
2024-06-11 8:20 ` Miklos Szeredi
2024-06-11 10:26 ` Bernd Schubert
2024-06-11 15:35 ` Miklos Szeredi
2024-06-11 17:37 ` Bernd Schubert
2024-06-11 23:35 ` Kent Overstreet
2024-06-12 13:53 ` Bernd Schubert
2024-06-12 14:19 ` Kent Overstreet
2024-06-12 15:40 ` Bernd Schubert
2024-06-12 15:55 ` Kent Overstreet
2024-06-12 16:15 ` Bernd Schubert
2024-06-12 16:24 ` Kent Overstreet
2024-06-12 16:44 ` Bernd Schubert
2024-06-12 7:39 ` Miklos Szeredi
2024-06-12 13:32 ` Bernd Schubert
2024-06-12 13:46 ` Bernd Schubert
2024-06-12 14:07 ` Miklos Szeredi
2024-06-12 14:56 ` Bernd Schubert
2024-08-02 23:03 ` Bernd Schubert
2024-08-29 22:32 ` Bernd Schubert
2024-08-30 13:12 ` Jens Axboe
2024-08-30 13:28 ` Bernd Schubert
2024-08-30 13:33 ` Jens Axboe
2024-08-30 14:55 ` Pavel Begunkov
2024-08-30 15:10 ` Bernd Schubert
2024-08-30 20:08 ` Jens Axboe
2024-08-31 0:02 ` Bernd Schubert
2024-08-31 0:49 ` Bernd Schubert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240529-fuse-uring-for-6-9-rfc2-out-v1-19-d149476b1d65@ddn.com \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox