From: Bernd Schubert <bschubert@ddn.com>
To: Miklos Szeredi <miklos@szeredi.hu>,
Amir Goldstein <amir73il@gmail.com>,
linux-fsdevel@vger.kernel.org,
Bernd Schubert <bschubert@ddn.com>,
bernd.schubert@fastmail.fm
Cc: io-uring@vger.kernel.org
Subject: [PATCH RFC v2 19/19] fuse: {uring} Optimize async sends
Date: Wed, 29 May 2024 20:00:54 +0200 [thread overview]
Message-ID: <20240529-fuse-uring-for-6-9-rfc2-out-v1-19-d149476b1d65@ddn.com> (raw)
In-Reply-To: <20240529-fuse-uring-for-6-9-rfc2-out-v1-0-d149476b1d65@ddn.com>
This is to avoid using async completion tasks
(i.e. context switches) when not needed.
Cc: io-uring@vger.kernel.org
Signed-off-by: Bernd Schubert <bschubert@ddn.com>
---
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 19:34 UTC|newest]
Thread overview: 113+ 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 ` [PATCH RFC v2 01/19] fuse: rename to fuse_dev_end_requests and make non-static Bernd Schubert
2024-05-29 21:09 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 02/19] fuse: Move fuse_get_dev to header file Bernd Schubert
2024-05-29 21:09 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 03/19] fuse: Move request bits Bernd Schubert
2024-05-29 21:10 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 04/19] fuse: Add fuse-io-uring design documentation Bernd Schubert
2024-05-29 21:17 ` Josef Bacik
2024-05-30 12:50 ` Bernd Schubert
2024-05-30 14:59 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 05/19] fuse: Add a uring config ioctl Bernd Schubert
2024-05-29 21:24 ` Josef Bacik
2024-05-30 12:51 ` Bernd Schubert
2024-06-03 13:03 ` Miklos Szeredi
2024-06-03 13:48 ` Bernd Schubert
2024-05-29 18:00 ` [PATCH RFC v2 06/19] Add a vmalloc_node_user function Bernd Schubert
2024-05-30 15:10 ` Josef Bacik
2024-05-30 16:13 ` Bernd Schubert
2024-05-31 13:56 ` Christoph Hellwig
2024-06-03 15:59 ` Kent Overstreet
2024-06-03 19:24 ` Bernd Schubert
2024-06-04 4:20 ` Christoph Hellwig
2024-06-07 2:30 ` Dave Chinner
2024-06-07 4:49 ` Christoph Hellwig
2024-06-04 4:08 ` Christoph Hellwig
2024-05-29 18:00 ` [PATCH RFC v2 07/19] fuse uring: Add an mmap method Bernd Schubert
2024-05-30 15:37 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 08/19] fuse: Add the queue configuration ioctl Bernd Schubert
2024-05-30 15:54 ` Josef Bacik
2024-05-30 17:49 ` Bernd Schubert
2024-05-29 18:00 ` [PATCH RFC v2 09/19] fuse: {uring} Add a dev_release exception for fuse-over-io-uring Bernd Schubert
2024-05-30 19:00 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 10/19] fuse: {uring} Handle SQEs - register commands Bernd Schubert
2024-05-30 19:55 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 11/19] fuse: Add support to copy from/to the ring buffer Bernd Schubert
2024-05-30 19:59 ` Josef Bacik
2024-09-01 11:56 ` Bernd Schubert
2024-09-01 11:56 ` Bernd Schubert
2024-05-29 18:00 ` [PATCH RFC v2 12/19] fuse: {uring} Add uring sqe commit and fetch support Bernd Schubert
2024-05-30 20:08 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 13/19] fuse: {uring} Handle uring shutdown Bernd Schubert
2024-05-30 20:21 ` Josef Bacik
2024-05-29 18:00 ` [PATCH RFC v2 14/19] fuse: {uring} Allow to queue to the ring Bernd Schubert
2024-05-30 20:32 ` Josef Bacik
2024-05-30 21:26 ` Bernd Schubert
2024-05-29 18:00 ` [PATCH RFC v2 15/19] export __wake_on_current_cpu Bernd Schubert
2024-05-30 20:37 ` Josef Bacik
2024-06-04 9:26 ` Peter Zijlstra
2024-06-04 9:36 ` Bernd Schubert
2024-06-04 19:27 ` Peter Zijlstra
2024-09-01 12:07 ` Bernd Schubert
2024-05-31 13:51 ` Christoph Hellwig
2024-05-29 18:00 ` [PATCH RFC v2 16/19] fuse: {uring} Wake requests on the the current cpu Bernd Schubert
2024-05-30 16:44 ` Shachar Sharon
2024-05-30 16:59 ` Bernd Schubert
2024-05-29 18:00 ` [PATCH RFC v2 17/19] fuse: {uring} Send async requests to qid of core + 1 Bernd Schubert
2024-05-29 18:00 ` [PATCH RFC v2 18/19] fuse: {uring} Set a min cpu offset io-size for reads/writes 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 \
--to=bschubert@ddn.com \
--cc=amir73il@gmail.com \
--cc=bernd.schubert@fastmail.fm \
--cc=io-uring@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=miklos@szeredi.hu \
/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;
as well as URLs for NNTP newsgroup(s).