From 592b915033de37322e19f3e6413de33317d272fe Mon Sep 17 00:00:00 2001 From: Chris Packham Date: Tue, 10 Nov 2020 10:02:26 +0800 Subject: [PATCH] io_uring: Add io_cqring_offset flags Add support for displaying struct io_cqring_offsets.flags introduced by Linux kernel commits v5.8-rc1~190^2~22 and v5.8-rc1~190^2~21. * types/io_uring.h (struct_io_cqring_offsets): Replace resv array with flags, resv1, and resv2 fields. * xlat/uring_cqring_flags.in: New file. * configure.ac (AC_CHECK_MEMBERS): Check struct io_cqring_offsets.flags. * io_uring.c: Include "xlat/uring_cqring_flags.h". (SYS_FUNC(io_uring_setup)): Replace printing of the resv array of struct io_cqring_offsets with flags, resv1, and resv2 fields. * tests/io_uring_setup.c: Check it. Signed-off-by: Dmitry V. Levin Resolves: https://github.com/strace/strace/issues/138 --- configure.ac | 1 + io_uring.c | 11 +++++++---- tests/io_uring_setup.c | 31 ++++++++++++++++++++++++++----- types/io_uring.h | 4 +++- xlat/uring_cqring_flags.in | 1 + 5 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 xlat/uring_cqring_flags.in diff --git a/configure.ac b/configure.ac index 7c4f929..958c097 100644 --- a/configure.ac +++ b/configure.ac @@ -475,6 +475,7 @@ AC_CHECK_HEADERS([linux/bpf.h], [ AC_CHECK_HEADERS([linux/io_uring.h], [ AC_CHECK_MEMBERS(m4_normalize([ + struct io_cqring_offsets.flags, struct io_uring_params.features, struct io_uring_params.wq_fd, struct io_uring_params.resv diff --git a/io_uring.c b/io_uring.c index cd18345..7da371f 100644 --- a/io_uring.c +++ b/io_uring.c @@ -17,6 +17,7 @@ #include "xlat/uring_setup_flags.h" #include "xlat/uring_enter_flags.h" #include "xlat/uring_register_opcodes.h" +#include "xlat/uring_cqring_flags.h" #ifdef HAVE_STRUCT_IO_CQRING_OFFSETS # ifdef HAVE_STRUCT_IO_CQRING_OFFSETS_RESV @@ -103,10 +104,12 @@ SYS_FUNC(io_uring_setup) PRINT_FIELD_U(", ", params.cq_off, ring_entries); PRINT_FIELD_U(", ", params.cq_off, overflow); PRINT_FIELD_U(", ", params.cq_off, cqes); - if (!IS_ARRAY_ZERO(params.cq_off.resv)) { - PRINT_FIELD_ARRAY(", ", params.cq_off, resv, tcp, - print_xint64_array_member); - } + PRINT_FIELD_FLAGS(", ", params.cq_off, flags, + uring_cqring_flags, "IORING_CQ_???"); + if (params.cq_off.resv1) + PRINT_FIELD_X(", ", params.cq_off, resv1); + if (params.cq_off.resv2) + PRINT_FIELD_X(", ", params.cq_off, resv2); tprints("}"); } tprints("}"); diff --git a/tests/io_uring_setup.c b/tests/io_uring_setup.c index 317b0d7..3d362b8 100644 --- a/tests/io_uring_setup.c +++ b/tests/io_uring_setup.c @@ -27,6 +27,7 @@ # include "xlat.h" # include "xlat/uring_setup_features.h" +# include "xlat/uring_cqring_flags.h" # ifdef HAVE_STRUCT_IO_URING_PARAMS_FEATURES # ifdef HAVE_STRUCT_IO_URING_PARAMS_WQ_FD @@ -144,20 +145,40 @@ main(void) params->sq_off.resv2); printf("}, cq_off={head=%u, tail=%u, ring_mask=%u" - ", ring_entries=%u, overflow=%u, cqes=%u", + ", ring_entries=%u, overflow=%u, cqes=%u", flags=", params->cq_off.head, params->cq_off.tail, params->cq_off.ring_mask, params->cq_off.ring_entries, params->cq_off.overflow, params->cq_off.cqes); - if (params->cq_off.resv[0] || params->cq_off.resv[1]) { - printf(", resv=[%#llx, %#llx]", +#ifdef HAVE_STRUCT_IO_CQRING_OFFSETS_FLAGS + printflags(uring_cqring_flags, + params->cq_off.flags, + "IORING_CQ_???"); + if (params->cq_off.resv1) + printf(", resv1=%#x", params->cq_off.resv1); + if (params->cq_off.resv2) + printf(", resv2=%#llx", (unsigned long long) - params->cq_off.resv[0], + params->cq_off.resv2); +#else + union { + struct { + uint32_t flags; + uint32_t resv1; + } s; + uint64_t v; + } u = { .v = params->cq_off.resv[0] }; + printflags(uring_cqring_flags, u.s.flags, + "IORING_CQ_???"); + if (u.s.resv1) + printf(", resv1=%#x", u.s.resv1); + if (params->cq_off.resv[1]) + printf(", resv2=%#llx", (unsigned long long) params->cq_off.resv[1]); - } +#endif printf("}}) = %ld\n", rc); } diff --git a/types/io_uring.h b/types/io_uring.h index 76f432c..2fe1c13 100644 --- a/types/io_uring.h +++ b/types/io_uring.h @@ -31,7 +31,9 @@ typedef struct { uint32_t ring_entries; uint32_t overflow; uint32_t cqes; - uint64_t resv[2]; + /** Added by v5.8-rc1~190^2~22 */ uint32_t flags; + /** Added by v5.8-rc1~190^2~22 */ uint32_t resv1; + /** Added by v5.8-rc1~190^2~22 */ uint64_t resv2; } struct_io_cqring_offsets; typedef struct { diff --git a/xlat/uring_cqring_flags.in b/xlat/uring_cqring_flags.in new file mode 100644 index 0000000..c81fbc2 --- /dev/null +++ b/xlat/uring_cqring_flags.in @@ -0,0 +1 @@ +IORING_CQ_EVENTFD_DISABLED 1U -- 2.27.0