From: Ming Lei <[email protected]>
To: Jens Axboe <[email protected]>, [email protected]
Cc: Ming Lei <[email protected]>
Subject: [PATCH] io_uring: support to inject result for NOP
Date: Fri, 10 May 2024 09:14:21 +0800 [thread overview]
Message-ID: <[email protected]> (raw)
Support to inject result for NOP so that we can inject failure from
userspace. It is very helpful for covering failure handling code in
io_uring core change.
With nop flags, it could be possible to add more test feature for NOP in
future, but the NOP behavior of direct completion has to be kept.
Cleared NOP SQE is required, look both liburing and Rust io-uring crate
clears SQE, and it shouldn't be one big deal for raw, especially it is
just NOP.
Suggested-by: Jens Axboe <[email protected]>
Signed-off-by: Ming Lei <[email protected]>
---
include/uapi/linux/io_uring.h | 13 ++++++++++++-
io_uring/nop.c | 28 ++++++++++++++++++++++++----
2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h
index 922f29b07ccc..5db3a209b302 100644
--- a/include/uapi/linux/io_uring.h
+++ b/include/uapi/linux/io_uring.h
@@ -48,7 +48,10 @@ struct io_uring_sqe {
__u32 optname;
};
};
- __u32 len; /* buffer size or number of iovecs */
+ union {
+ __u32 len; /* buffer size or number of iovecs */
+ __s32 result; /* for NOP to inject result only */
+ };
union {
__kernel_rwf_t rw_flags;
__u32 fsync_flags;
@@ -72,6 +75,7 @@ struct io_uring_sqe {
__u32 waitid_flags;
__u32 futex_flags;
__u32 install_fd_flags;
+ __u32 nop_flags;
};
__u64 user_data; /* data to be passed back at completion time */
/* pack this to avoid bogus arm OABI complaints */
@@ -413,6 +417,13 @@ enum io_uring_msg_ring_flags {
*/
#define IORING_FIXED_FD_NO_CLOEXEC (1U << 0)
+/*
+ * IORING_OP_NOP flags (sqe->nop_flags)
+ *
+ * IORING_NOP_INJECT_RESULT Inject result from sqe->result
+ */
+#define IORING_NOP_INJECT_RESULT (1U << 0)
+
/*
* IO completion data structure (Completion Queue Entry)
*/
diff --git a/io_uring/nop.c b/io_uring/nop.c
index d956599a3c1b..c002b8ef2d5f 100644
--- a/io_uring/nop.c
+++ b/io_uring/nop.c
@@ -10,16 +10,36 @@
#include "io_uring.h"
#include "nop.h"
+struct io_nop {
+ /* NOTE: kiocb has the file as the first member, so don't do it here */
+ struct file *file;
+ unsigned int flags;
+ int result;
+};
+
int io_nop_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
+ struct io_nop *nop = io_kiocb_to_cmd(req, struct io_nop);
+ unsigned int flags;
+
+ flags = READ_ONCE(sqe->nop_flags);
+ if (flags & ~IORING_NOP_INJECT_RESULT)
+ return -EINVAL;
+
+ nop->flags = flags;
+ if (nop->flags & IORING_NOP_INJECT_RESULT)
+ nop->result = READ_ONCE(sqe->result);
+ else
+ nop->result = 0;
return 0;
}
-/*
- * IORING_OP_NOP just posts a completion event, nothing else.
- */
int io_nop(struct io_kiocb *req, unsigned int issue_flags)
{
- io_req_set_res(req, 0, 0);
+ struct io_nop *nop = io_kiocb_to_cmd(req, struct io_nop);
+
+ if (nop->result < 0)
+ req_set_fail(req);
+ io_req_set_res(req, nop->result, 0);
return IOU_OK;
}
--
2.44.0
next reply other threads:[~2024-05-10 1:14 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-10 1:14 Ming Lei [this message]
2024-05-10 2:19 ` [PATCH] io_uring: support to inject result for NOP Jens Axboe
2024-05-10 3:07 ` Ming Lei
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 \
[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