summaryrefslogtreecommitdiffstats
path: root/io_uring/opdef.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2023-07-11 00:14:37 +0200
committerJens Axboe <axboe@kernel.dk>2023-09-21 20:04:45 +0200
commitf31ecf671ddc498f20219453395794ff2383e06b (patch)
tree41835b9eb01ecf14ee7f16e428158601b34e4748 /io_uring/opdef.c
parentexit: add internal include file with helpers (diff)
downloadlinux-f31ecf671ddc498f20219453395794ff2383e06b.tar.xz
linux-f31ecf671ddc498f20219453395794ff2383e06b.zip
io_uring: add IORING_OP_WAITID support
This adds support for an async version of waitid(2), in a fully async version. If an event isn't immediately available, wait for a callback to trigger a retry. The format of the sqe is as follows: sqe->len The 'which', the idtype being queried/waited for. sqe->fd The 'pid' (or id) being waited for. sqe->file_index The 'options' being set. sqe->addr2 A pointer to siginfo_t, if any, being filled in. buf_index, add3, and waitid_flags are reserved/unused for now. waitid_flags will be used for options for this request type. One interesting use case may be to add multi-shot support, so that the request stays armed and posts a notification every time a monitored process state change occurs. Note that this does not support rusage, on Arnd's recommendation. See the waitid(2) man page for details on the arguments. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/opdef.c')
-rw-r--r--io_uring/opdef.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/io_uring/opdef.c b/io_uring/opdef.c
index a3fb1f9b3998..aadcbf7136b0 100644
--- a/io_uring/opdef.c
+++ b/io_uring/opdef.c
@@ -33,6 +33,7 @@
#include "poll.h"
#include "cancel.h"
#include "rw.h"
+#include "waitid.h"
static int io_no_issue(struct io_kiocb *req, unsigned int issue_flags)
{
@@ -439,6 +440,10 @@ const struct io_issue_def io_issue_defs[] = {
.prep = io_read_mshot_prep,
.issue = io_read_mshot,
},
+ [IORING_OP_WAITID] = {
+ .prep = io_waitid_prep,
+ .issue = io_waitid,
+ },
};
const struct io_cold_def io_cold_defs[] = {
@@ -661,6 +666,10 @@ const struct io_cold_def io_cold_defs[] = {
[IORING_OP_READ_MULTISHOT] = {
.name = "READ_MULTISHOT",
},
+ [IORING_OP_WAITID] = {
+ .name = "WAITID",
+ .async_size = sizeof(struct io_waitid_async),
+ },
};
const char *io_uring_get_opcode(u8 opcode)