From: Keith Busch <kbusch@meta.com>
To: <linux-block@vger.kernel.org>, <linux-nvme@lists.infradead.org>,
<axboe@kernel.dk>, <hch@lst.de>, <io-uring@vger.kernel.org>
Cc: <linux-fsdevel@vger.kernel.org>, <joshi.k@samsung.com>,
<javier.gonz@samsung.com>, Nitesh Shetty <nj.shetty@samsung.com>,
Keith Busch <kbusch@kernel.org>
Subject: [PATCHv8 5/6] io_uring: enable per-io hinting capability
Date: Thu, 17 Oct 2024 09:09:36 -0700 [thread overview]
Message-ID: <20241017160937.2283225-6-kbusch@meta.com> (raw)
In-Reply-To: <20241017160937.2283225-1-kbusch@meta.com>
From: Kanchan Joshi <joshi.k@samsung.com>
With F_SET_RW_HINT fcntl, user can set a hint on the file inode, and
all the subsequent writes on the file pass that hint value down. This
can be limiting for block device as all the writes can be tagged with
only one lifetime hint value. Concurrent writes (with different hint
values) are hard to manage. Per-IO hinting solves that problem.
Allow userspace to pass additional metadata in the SQE.
__u16 write_hint;
This accepts all hint values that the file allows.
The write handlers (io_prep_rw, io_write) send the hint value to
lower-layer using kiocb. This is good for upporting direct IO, but not
when kiocb is not available (e.g., buffered IO).
When per-io hints are not passed, the per-inode hint values are set in
the kiocb (as before). Otherwise, per-io hints take the precedence over
per-inode hints.
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
---
include/uapi/linux/io_uring.h | 4 ++++
io_uring/rw.c | 11 +++++++++--
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h
index 86cb385fe0b53..bd9acc0053318 100644
--- a/include/uapi/linux/io_uring.h
+++ b/include/uapi/linux/io_uring.h
@@ -92,6 +92,10 @@ struct io_uring_sqe {
__u16 addr_len;
__u16 __pad3[1];
};
+ struct {
+ __u16 write_hint;
+ __u16 __pad4[1];
+ };
};
union {
struct {
diff --git a/io_uring/rw.c b/io_uring/rw.c
index ffd637ca0bd17..9a6d3ba76af4f 100644
--- a/io_uring/rw.c
+++ b/io_uring/rw.c
@@ -279,7 +279,11 @@ static int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe,
rw->kiocb.ki_ioprio = get_current_ioprio();
}
rw->kiocb.dio_complete = NULL;
-
+ if (ddir == ITER_SOURCE &&
+ req->file->f_op->fop_flags & FOP_PER_IO_HINTS)
+ rw->kiocb.ki_write_hint = READ_ONCE(sqe->write_hint);
+ else
+ rw->kiocb.ki_write_hint = WRITE_LIFE_NOT_SET;
rw->addr = READ_ONCE(sqe->addr);
rw->len = READ_ONCE(sqe->len);
rw->flags = READ_ONCE(sqe->rw_flags);
@@ -1027,7 +1031,10 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags)
if (unlikely(ret))
return ret;
req->cqe.res = iov_iter_count(&io->iter);
- rw->kiocb.ki_write_hint = file_write_hint(rw->kiocb.ki_filp);
+
+ /* Use per-file hint only if per-io hint is not set. */
+ if (rw->kiocb.ki_write_hint == WRITE_LIFE_NOT_SET)
+ rw->kiocb.ki_write_hint = file_write_hint(rw->kiocb.ki_filp);
if (force_nonblock) {
/* If the file doesn't support async, just async punt */
--
2.43.5
next prev parent reply other threads:[~2024-10-17 16:11 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-17 16:09 [PATCHv8 0/6] write hints for nvme fdp Keith Busch
2024-10-17 16:09 ` [PATCHv8 1/6] block, fs: restore kiocb based write hint processing Keith Busch
2024-10-18 5:50 ` Christoph Hellwig
2024-10-21 15:47 ` Keith Busch
2024-10-21 17:09 ` Bart Van Assche
2024-10-21 19:35 ` Keith Busch
2024-10-22 6:43 ` Christoph Hellwig
2024-10-22 14:37 ` Keith Busch
2024-10-22 14:40 ` Christoph Hellwig
2024-10-18 16:11 ` Bart Van Assche
2024-10-17 16:09 ` [PATCHv8 2/6] block: use generic u16 for write hints Keith Busch
2024-10-18 5:46 ` Christoph Hellwig
2024-10-24 19:45 ` Keith Busch
2024-10-25 12:20 ` Christoph Hellwig
2024-10-18 6:00 ` Hannes Reinecke
2024-10-18 16:12 ` Bart Van Assche
2024-10-21 15:03 ` Keith Busch
2024-10-17 16:09 ` [PATCHv8 3/6] block: introduce max_write_hints queue limit Keith Busch
2024-10-18 5:51 ` Christoph Hellwig
2024-10-18 6:01 ` Hannes Reinecke
2024-10-18 16:18 ` Bart Van Assche
2024-10-21 15:02 ` Keith Busch
2024-10-17 16:09 ` [PATCHv8 4/6] fs: introduce per-io hint support flag Keith Busch
2024-10-18 5:52 ` Christoph Hellwig
2024-10-18 6:03 ` Hannes Reinecke
2024-10-17 16:09 ` Keith Busch [this message]
2024-10-18 5:53 ` [PATCHv8 5/6] io_uring: enable per-io hinting capability Christoph Hellwig
2024-10-18 6:03 ` Hannes Reinecke
2024-10-17 16:09 ` [PATCHv8 6/6] nvme: enable FDP support Keith Busch
2024-10-18 10:48 ` Kanchan Joshi
2024-10-21 15:08 ` Keith Busch
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=20241017160937.2283225-6-kbusch@meta.com \
--to=kbusch@meta.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=io-uring@vger.kernel.org \
--cc=javier.gonz@samsung.com \
--cc=joshi.k@samsung.com \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=nj.shetty@samsung.com \
/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