io_uring: add support for user mapped provided buffer ring
authorJens Axboe <axboe@kernel.dk>
Tue, 14 Mar 2023 17:07:19 +0000 (11:07 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 3 Apr 2023 13:14:21 +0000 (07:14 -0600)
commitc56e022c0a27142b7b59ae6bdf45f86bf4b298a1
treefe2dd7047b6231430a8cac684dd1a0aed2eb4fde
parent81cf17cd3ab3e5441e876a8e9e9c38ae9920cecb
io_uring: add support for user mapped provided buffer ring

The ring mapped provided buffer rings rely on the application allocating
the memory for the ring, and then the kernel will map it. This generally
works fine, but runs into issues on some architectures where we need
to be able to ensure that the kernel and application virtual address for
the ring play nicely together. This at least impacts architectures that
set SHM_COLOUR, but potentially also anyone setting SHMLBA.

To use this variant of ring provided buffers, the application need not
allocate any memory for the ring. Instead the kernel will do so, and
the allocation must subsequently call mmap(2) on the ring with the
offset set to:

IORING_OFF_PBUF_RING | (bgid << IORING_OFF_PBUF_SHIFT)

to get a virtual address for the buffer ring. Normally the application
would allocate a suitable piece of memory (and correctly aligned) and
simply pass that in via io_uring_buf_reg.ring_addr and the kernel would
map it.

Outside of the setup differences, the kernel allocate + user mapped
provided buffer ring works exactly the same.

Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/uapi/linux/io_uring.h
io_uring/io_uring.c
io_uring/kbuf.c
io_uring/kbuf.h