io_uring/msg_ring: add support for sending a sync message
authorJens Axboe <axboe@kernel.dk>
Tue, 24 Sep 2024 11:57:31 +0000 (05:57 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 14 Oct 2024 15:04:10 +0000 (09:04 -0600)
commita0df6d7d5fb86f7b16af7938dc1b2bb96f5029c2
tree17b9cca71182db8e21e0617c1b77247467b07486
parented61eb79c1e79402fe84f8ab7d6338def995f4d2
io_uring/msg_ring: add support for sending a sync message

Normally MSG_RING requires both a source and a destination ring. But
some users don't always have a ring avilable to send a message from, yet
they still need to notify a target ring.

Add support for using io_uring_register(2) without having a source ring,
using a file descriptor of -1 for that. Internally those are called
blind registration opcodes. Implement IORING_REGISTER_SEND_MSG_RING as a
blind opcode, which simply takes an sqe that the application can put on
the stack and use the normal liburing helpers to initialize it. Then the
app can call:

io_uring_register(-1, IORING_REGISTER_SEND_MSG_RING, &sqe, 1);

and get the same behavior in terms of the target, where a CQE is posted
with the details given in the sqe.

For now this takes a single sqe pointer argument, and hence arg must
be set to that, and nr_args must be 1. Could easily be extended to take
an array of sqes, but for now let's keep it simple.

Link: https://lore.kernel.org/r/20240924115932.116167-3-axboe@kernel.dk
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/uapi/linux/io_uring.h
io_uring/msg_ring.c
io_uring/msg_ring.h
io_uring/register.c