* [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support @ 2023-09-29 12:09 Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 1/2] setup: add " Pavel Begunkov ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: Pavel Begunkov @ 2023-09-29 12:09 UTC (permalink / raw) To: io-uring; +Cc: Jens Axboe, asml.silence Patch 1 adds support for IORING_SETUP_NO_SQARRAY, i.e. not using and mmaping the first SQ indirection level sq_array. Patch 2 defaults liburing to using IORING_SETUP_NO_SQARRAY. If it's not supported by the kernel we'll fallback to a setup without the flag. If the user specifically asks for IORING_SETUP_NO_SQARRAY, it'll also fail if the feature is unsupported. Note: two tests need sqarray, and so there is a new helper __io_uring_queue_init_params(), which is not static but not exported by the library. Further, we don't declare it in liburing.h but only under tests to prevent misuse. Pavel Begunkov (2): setup: add IORING_SETUP_NO_SQARRAY support setup: default to IORING_SETUP_NO_SQARRAY src/include/liburing/io_uring.h | 5 ++++ src/setup.c | 42 +++++++++++++++++++++++++-------- test/accept-reuse.c | 2 +- test/helpers.h | 13 ++++++++++ test/io_uring_enter.c | 7 ++++-- 5 files changed, 56 insertions(+), 13 deletions(-) -- 2.41.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH liburing 1/2] setup: add IORING_SETUP_NO_SQARRAY support 2023-09-29 12:09 [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Pavel Begunkov @ 2023-09-29 12:09 ` Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 2/2] setup: default to IORING_SETUP_NO_SQARRAY Pavel Begunkov 2023-10-18 15:40 ` [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Jens Axboe 2 siblings, 0 replies; 4+ messages in thread From: Pavel Begunkov @ 2023-09-29 12:09 UTC (permalink / raw) To: io-uring; +Cc: Jens Axboe, asml.silence IORING_SETUP_NO_SQARRAY removes sq_array from the kernel, and hence when set liburing should not try to mmap and initialise it. Signed-off-by: Pavel Begunkov <[email protected]> --- src/include/liburing/io_uring.h | 5 +++++ src/setup.c | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h index 10a6ef0..793d64f 100644 --- a/src/include/liburing/io_uring.h +++ b/src/include/liburing/io_uring.h @@ -185,6 +185,11 @@ enum { */ #define IORING_SETUP_REGISTERED_FD_ONLY (1U << 15) +/* + * Removes indirection through the SQ index array. + */ +#define IORING_SETUP_NO_SQARRAY (1U << 16) + enum io_uring_op { IORING_OP_NOP, IORING_OP_READV, diff --git a/src/setup.c b/src/setup.c index 2dcb5aa..a0e8296 100644 --- a/src/setup.c +++ b/src/setup.c @@ -76,7 +76,8 @@ static void io_uring_setup_ring_pointers(struct io_uring_params *p, sq->kring_entries = sq->ring_ptr + p->sq_off.ring_entries; sq->kflags = sq->ring_ptr + p->sq_off.flags; sq->kdropped = sq->ring_ptr + p->sq_off.dropped; - sq->array = sq->ring_ptr + p->sq_off.array; + if (!(p->flags & IORING_SETUP_NO_SQARRAY)) + sq->array = sq->ring_ptr + p->sq_off.array; cq->khead = cq->ring_ptr + p->cq_off.head; cq->ktail = cq->ring_ptr + p->cq_off.tail; @@ -220,7 +221,8 @@ static int io_uring_alloc_huge(unsigned entries, struct io_uring_params *p, ring_mem = cq_entries * sizeof(struct io_uring_cqe); if (p->flags & IORING_SETUP_CQE32) ring_mem *= 2; - ring_mem += sq_entries * sizeof(unsigned); + if (!(p->flags & IORING_SETUP_NO_SQARRAY)) + ring_mem += sq_entries * sizeof(unsigned); mem_used = sqes_mem + ring_mem; mem_used = (mem_used + page_size - 1) & ~(page_size - 1); @@ -335,11 +337,13 @@ static int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring, /* * Directly map SQ slots to SQEs */ - sq_array = ring->sq.array; sq_entries = ring->sq.ring_entries; - for (index = 0; index < sq_entries; index++) - sq_array[index] = index; + if (!(p->flags & IORING_SETUP_NO_SQARRAY)) { + sq_array = ring->sq.array; + for (index = 0; index < sq_entries; index++) + sq_array[index] = index; + } ring->features = p->features; ring->flags = p->flags; ring->enter_ring_fd = fd; -- 2.41.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH liburing 2/2] setup: default to IORING_SETUP_NO_SQARRAY 2023-09-29 12:09 [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 1/2] setup: add " Pavel Begunkov @ 2023-09-29 12:09 ` Pavel Begunkov 2023-10-18 15:40 ` [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Jens Axboe 2 siblings, 0 replies; 4+ messages in thread From: Pavel Begunkov @ 2023-09-29 12:09 UTC (permalink / raw) To: io-uring; +Cc: Jens Axboe, asml.silence We have never exposed sq_array to users, so we can safely add IORING_SETUP_NO_SQARRAY to all rings. If the kernel is too old and it fails, we'll retry creating a ring without it. Signed-off-by: Pavel Begunkov <[email protected]> --- src/setup.c | 28 +++++++++++++++++++++++----- test/accept-reuse.c | 2 +- test/helpers.h | 13 +++++++++++++ test/io_uring_enter.c | 7 +++++-- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/setup.c b/src/setup.c index a0e8296..6b3f538 100644 --- a/src/setup.c +++ b/src/setup.c @@ -287,9 +287,9 @@ static int io_uring_alloc_huge(unsigned entries, struct io_uring_params *p, return (int) mem_used; } -static int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring, - struct io_uring_params *p, void *buf, - size_t buf_size) +int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring, + struct io_uring_params *p, void *buf, + size_t buf_size) { int fd, ret = 0; unsigned *sq_array; @@ -357,6 +357,24 @@ static int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring, return ret; } +static int io_uring_queue_init_try_nosqarr(unsigned entries, struct io_uring *ring, + struct io_uring_params *p, void *buf, + size_t buf_size) +{ + unsigned flags = p->flags; + int ret; + + p->flags |= IORING_SETUP_NO_SQARRAY; + ret = __io_uring_queue_init_params(entries, ring, p, buf, buf_size); + + /* don't fallback if explicitly asked for NOSQARRAY */ + if (ret != -EINVAL || (flags & IORING_SETUP_NO_SQARRAY)) + return ret; + + p->flags = flags; + return __io_uring_queue_init_params(entries, ring, p, buf, buf_size); +} + /* * Like io_uring_queue_init_params(), except it allows the application to pass * in a pre-allocated memory range that is used for the shared data between @@ -375,7 +393,7 @@ int io_uring_queue_init_mem(unsigned entries, struct io_uring *ring, { /* should already be set... */ p->flags |= IORING_SETUP_NO_MMAP; - return __io_uring_queue_init_params(entries, ring, p, buf, buf_size); + return io_uring_queue_init_try_nosqarr(entries, ring, p, buf, buf_size); } int io_uring_queue_init_params(unsigned entries, struct io_uring *ring, @@ -383,7 +401,7 @@ int io_uring_queue_init_params(unsigned entries, struct io_uring *ring, { int ret; - ret = __io_uring_queue_init_params(entries, ring, p, NULL, 0); + ret = io_uring_queue_init_try_nosqarr(entries, ring, p, NULL, 0); return ret >= 0 ? 0 : ret; } diff --git a/test/accept-reuse.c b/test/accept-reuse.c index 1f10b45..716f201 100644 --- a/test/accept-reuse.c +++ b/test/accept-reuse.c @@ -45,7 +45,7 @@ int main(int argc, char **argv) return T_EXIT_SKIP; memset(¶ms, 0, sizeof(params)); - ret = io_uring_queue_init_params(4, &io_uring, ¶ms); + ret = t_io_uring_init_sqarray(4, &io_uring, ¶ms); if (ret) { fprintf(stderr, "io_uring_init_failed: %d\n", ret); return T_EXIT_FAIL; diff --git a/test/helpers.h b/test/helpers.h index 5307324..d91c1dc 100644 --- a/test/helpers.h +++ b/test/helpers.h @@ -87,6 +87,19 @@ bool t_probe_defer_taskrun(void); unsigned __io_uring_flush_sq(struct io_uring *ring); +int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring, + struct io_uring_params *p, void *buf, + size_t buf_size); + +static inline int t_io_uring_init_sqarray(unsigned entries, struct io_uring *ring, + struct io_uring_params *p) +{ + int ret; + + ret = __io_uring_queue_init_params(entries, ring, p, NULL, 0); + return ret >= 0 ? 0 : ret; +} + #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) void t_error(int status, int errnum, const char *format, ...); diff --git a/test/io_uring_enter.c b/test/io_uring_enter.c index ecd54ff..2a6b6be 100644 --- a/test/io_uring_enter.c +++ b/test/io_uring_enter.c @@ -183,13 +183,16 @@ int main(int argc, char **argv) unsigned ktail, mask, index; unsigned sq_entries; unsigned completed, dropped; + struct io_uring_params p; if (argc > 1) return T_EXIT_SKIP; - ret = io_uring_queue_init(IORING_MAX_ENTRIES, &ring, 0); + memset(&p, 0, sizeof(p)); + ret = t_io_uring_init_sqarray(IORING_MAX_ENTRIES, &ring, &p); if (ret == -ENOMEM) - ret = io_uring_queue_init(IORING_MAX_ENTRIES_FALLBACK, &ring, 0); + ret = t_io_uring_init_sqarray(IORING_MAX_ENTRIES_FALLBACK, + &ring, &p); if (ret < 0) { perror("io_uring_queue_init"); exit(T_EXIT_FAIL); -- 2.41.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support 2023-09-29 12:09 [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 1/2] setup: add " Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 2/2] setup: default to IORING_SETUP_NO_SQARRAY Pavel Begunkov @ 2023-10-18 15:40 ` Jens Axboe 2 siblings, 0 replies; 4+ messages in thread From: Jens Axboe @ 2023-10-18 15:40 UTC (permalink / raw) To: io-uring, Pavel Begunkov On Fri, 29 Sep 2023 13:09:39 +0100, Pavel Begunkov wrote: > Patch 1 adds support for IORING_SETUP_NO_SQARRAY, i.e. not using and > mmaping the first SQ indirection level sq_array. > > Patch 2 defaults liburing to using IORING_SETUP_NO_SQARRAY. If it's > not supported by the kernel we'll fallback to a setup without the > flag. If the user specifically asks for IORING_SETUP_NO_SQARRAY, > it'll also fail if the feature is unsupported. > > [...] Applied, thanks! [1/2] setup: add IORING_SETUP_NO_SQARRAY support commit: 74c1191cbfa2b552b3ceaa63386d871c2d5d2136 [2/2] setup: default to IORING_SETUP_NO_SQARRAY commit: 3401b06c5e8291a2ad946bb181ab347f18a4c8c3 Best regards, -- Jens Axboe ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-10-18 15:40 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-09-29 12:09 [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 1/2] setup: add " Pavel Begunkov 2023-09-29 12:09 ` [PATCH liburing 2/2] setup: default to IORING_SETUP_NO_SQARRAY Pavel Begunkov 2023-10-18 15:40 ` [PATCH liburing 0/2] liburing IORING_SETUP_NO_SQARRAY support Jens Axboe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox