There is an ABI change for not yet released buffer/files registration/update tagging/etc. support. Update the bits. Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> --- src/include/liburing/io_uring.h | 20 +++++++------- test/rsrc_tags.c | 46 ++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h index 5a3cb90..4c5685d 100644 --- a/src/include/liburing/io_uring.h +++ b/src/include/liburing/io_uring.h @@ -141,7 +141,6 @@ enum { IORING_OP_SHUTDOWN, IORING_OP_RENAMEAT, IORING_OP_UNLINKAT, - IORING_OP_MKDIRAT, /* this goes last, obviously */ IORING_OP_LAST, @@ -285,6 +284,7 @@ struct io_uring_params { #define IORING_FEAT_SQPOLL_NONFIXED (1U << 7) #define IORING_FEAT_EXT_ARG (1U << 8) #define IORING_FEAT_NATIVE_WORKERS (1U << 9) +#define IORING_FEAT_RSRC_TAGS (1U << 10) /* * io_uring_register(2) opcodes and arguments @@ -303,8 +303,12 @@ enum { IORING_UNREGISTER_PERSONALITY = 10, IORING_REGISTER_RESTRICTIONS = 11, IORING_REGISTER_ENABLE_RINGS = 12, - IORING_REGISTER_RSRC = 13, - IORING_REGISTER_RSRC_UPDATE = 14, + + /* extended with tagging */ + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, /* this goes last */ IORING_REGISTER_LAST @@ -317,14 +321,10 @@ struct io_uring_files_update { __aligned_u64 /* __s32 * */ fds; }; -enum { - IORING_RSRC_FILE = 0, - IORING_RSRC_BUFFER = 1, -}; - struct io_uring_rsrc_register { - __u32 type; __u32 nr; + __u32 resv; + __u64 resv2; __aligned_u64 data; __aligned_u64 tags; }; @@ -340,8 +340,8 @@ struct io_uring_rsrc_update2 { __u32 resv; __aligned_u64 data; __aligned_u64 tags; - __u32 type; __u32 nr; + __u32 resv2; }; /* Skip updating fd indexes set to this value in the fd table */ diff --git a/test/rsrc_tags.c b/test/rsrc_tags.c index 7192873..2b4890b 100644 --- a/test/rsrc_tags.c +++ b/test/rsrc_tags.c @@ -17,6 +17,11 @@ static int pipes[2]; +enum { + TEST_IORING_RSRC_FILE = 0, + TEST_IORING_RSRC_BUFFER = 1, +}; + static bool check_cq_empty(struct io_uring *ring) { struct io_uring_cqe *cqe = NULL; @@ -31,15 +36,18 @@ static int register_rsrc(struct io_uring *ring, int type, int nr, const void *arg, const __u64 *tags) { struct io_uring_rsrc_register reg; - int ret; + int ret, reg_type; memset(®, 0, sizeof(reg)); - reg.type = type; reg.nr = nr; reg.data = (__u64)arg; reg.tags = (__u64)tags; - ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_RSRC, + reg_type = IORING_REGISTER_FILES2; + if (type != TEST_IORING_RSRC_FILE) + reg_type = IORING_REGISTER_BUFFERS2; + + ret = __sys_io_uring_register(ring->ring_fd, reg_type, ®, sizeof(reg)); return ret ? -errno : 0; } @@ -48,16 +56,18 @@ static int update_rsrc(struct io_uring *ring, int type, int nr, int off, const void *arg, const __u64 *tags) { struct io_uring_rsrc_update2 up; - int ret; + int ret, up_type; memset(&up, 0, sizeof(up)); up.offset = off; up.data = (__u64)arg; up.tags = (__u64)tags; - up.type = type; up.nr = nr; - ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_RSRC_UPDATE, + up_type = IORING_REGISTER_FILES_UPDATE2; + if (type != TEST_IORING_RSRC_FILE) + up_type = IORING_REGISTER_BUFFERS_UPDATE; + ret = __sys_io_uring_register(ring->ring_fd, up_type, &up, sizeof(up)); return ret < 0 ? -errno : ret; } @@ -73,7 +83,7 @@ static bool has_rsrc_update(void) if (ret) return false; - ret = register_rsrc(&ring, IORING_RSRC_BUFFER, 1, &vec, NULL); + ret = register_rsrc(&ring, TEST_IORING_RSRC_BUFFER, 1, &vec, NULL); io_uring_queue_exit(&ring); return ret != -EINVAL; } @@ -148,7 +158,7 @@ static int test_buffers_update(void) tags[i] = i + 1; } - ret = test_tags_generic(nr, IORING_RSRC_BUFFER, vecs, 0); + ret = test_tags_generic(nr, TEST_IORING_RSRC_BUFFER, vecs, 0); if (ret) return 1; @@ -161,7 +171,7 @@ static int test_buffers_update(void) perror("pipe"); return 1; } - ret = register_rsrc(&ring, IORING_RSRC_BUFFER, nr, vecs, tags); + ret = register_rsrc(&ring, TEST_IORING_RSRC_BUFFER, nr, vecs, tags); if (ret) { fprintf(stderr, "rsrc register failed %i\n", ret); return 1; @@ -180,7 +190,7 @@ static int test_buffers_update(void) assert(ret == -EAGAIN); vecs[buf_idx].iov_base = tmp_buf2; - ret = update_rsrc(&ring, IORING_RSRC_BUFFER, 1, buf_idx, + ret = update_rsrc(&ring, TEST_IORING_RSRC_BUFFER, 1, buf_idx, &vecs[buf_idx], &tags[buf_idx]); if (ret != 1) { fprintf(stderr, "rsrc update failed %i %i\n", ret, errno); @@ -226,7 +236,7 @@ static int test_buffers_empty_buffers(void) return 1; } - ret = register_rsrc(&ring, IORING_RSRC_BUFFER, nr, vecs, NULL); + ret = register_rsrc(&ring, TEST_IORING_RSRC_BUFFER, nr, vecs, NULL); if (ret) { fprintf(stderr, "rsrc register failed %i\n", ret); return 1; @@ -235,7 +245,7 @@ static int test_buffers_empty_buffers(void) /* empty to buffer */ vecs[1].iov_base = tmp_buf; vecs[1].iov_len = 10; - ret = update_rsrc(&ring, IORING_RSRC_BUFFER, 1, 1, &vecs[1], NULL); + ret = update_rsrc(&ring, TEST_IORING_RSRC_BUFFER, 1, 1, &vecs[1], NULL); if (ret != 1) { fprintf(stderr, "rsrc update failed %i %i\n", ret, errno); return 1; @@ -244,14 +254,14 @@ static int test_buffers_empty_buffers(void) /* buffer to empty */ vecs[0].iov_base = 0; vecs[0].iov_len = 0; - ret = update_rsrc(&ring, IORING_RSRC_BUFFER, 1, 0, &vecs[0], NULL); + ret = update_rsrc(&ring, TEST_IORING_RSRC_BUFFER, 1, 0, &vecs[0], NULL); if (ret != 1) { fprintf(stderr, "rsrc update failed %i %i\n", ret, errno); return 1; } /* zero to zero is ok */ - ret = update_rsrc(&ring, IORING_RSRC_BUFFER, 1, 2, &vecs[2], NULL); + ret = update_rsrc(&ring, TEST_IORING_RSRC_BUFFER, 1, 2, &vecs[2], NULL); if (ret != 1) { fprintf(stderr, "rsrc update failed %i %i\n", ret, errno); return 1; @@ -260,7 +270,7 @@ static int test_buffers_empty_buffers(void) /* empty buf with non-zero len fails */ vecs[3].iov_base = 0; vecs[3].iov_len = 1; - ret = update_rsrc(&ring, IORING_RSRC_BUFFER, 1, 3, &vecs[3], NULL); + ret = update_rsrc(&ring, TEST_IORING_RSRC_BUFFER, 1, 3, &vecs[3], NULL); if (ret >= 0) { fprintf(stderr, "rsrc update failed %i %i\n", ret, errno); return 1; @@ -312,7 +322,7 @@ static int test_files(int ring_flags) tags[i] = i + 1; } - ret = test_tags_generic(nr, IORING_RSRC_FILE, files, ring_flags); + ret = test_tags_generic(nr, TEST_IORING_RSRC_FILE, files, ring_flags); if (ret) return 1; @@ -321,7 +331,7 @@ static int test_files(int ring_flags) printf("ring setup failed\n"); return 1; } - ret = register_rsrc(&ring, IORING_RSRC_FILE, nr, files, tags); + ret = register_rsrc(&ring, TEST_IORING_RSRC_FILE, nr, files, tags); if (ret) { fprintf(stderr, "rsrc register failed %i\n", ret); return 1; @@ -343,7 +353,7 @@ static int test_files(int ring_flags) /* non-zero tag with remove update is disallowed */ tag = 1; fd = -1; - ret = update_rsrc(&ring, IORING_RSRC_FILE, 1, off + 1, &fd, &tag); + ret = update_rsrc(&ring, TEST_IORING_RSRC_FILE, 1, off + 1, &fd, &tag); assert(ret); io_uring_queue_exit(&ring); -- 2.31.1