commit: aae46e49a8fa4ffa637ae2c7577abffe7c989cda
parent 7ed22dda2a0e60bf5739f6c8da034c86e2523af0
Author: Michael Forney <mforney@mforney.org>
Date: Mon, 3 Aug 2020 22:54:01 -0700
strace: Cherry-pick some patches to fix build with linux 5.8 headers
Diffstat:
4 files changed, 254 insertions(+), 1 deletion(-)
diff --git a/pkg/strace/config.h b/pkg/strace/config.h
@@ -698,6 +698,7 @@
#define HAVE_STRUCT_IOCB_AIO_FLAGS 1
#define HAVE_STRUCT_IOCB_AIO_RW_FLAGS 1
#define HAVE_STRUCT_IO_CQRING_OFFSETS 1
+/* #undef HAVE_STRUCT_IO_CQRING_OFFSETS_FLAGS */
#define HAVE_STRUCT_IO_CQRING_OFFSETS_RESV 1
#define HAVE_STRUCT_IO_SQRING_OFFSETS 1
#define HAVE_STRUCT_IO_SQRING_OFFSETS_RESV2 1
diff --git a/pkg/strace/patch/0012-io_uring-Remove-struct-io_cqring_offsets-compile-tim.patch b/pkg/strace/patch/0012-io_uring-Remove-struct-io_cqring_offsets-compile-tim.patch
@@ -0,0 +1,44 @@
+From 8ba630f69445285a84daa356fc9bdb0dd059be40 Mon Sep 17 00:00:00 2001
+From: Chris Packham <chris.packham@alliedtelesis.co.nz>
+Date: Mon, 15 Jun 2020 22:01:25 +1200
+Subject: [PATCH] io_uring: Remove struct io_cqring_offsets compile time
+ asserts
+
+The generated types/check-io_uring.c already checks the kernel's struct
+io_cqring_offsets for compatibility with the strace definition so
+there's no need for manual checks.
+
+* io_uring.c [HAVE_STRUCT_IO_CQRING_OFFSETS]: Remove static_asserts.
+---
+ io_uring.c | 15 ---------------
+ 1 file changed, 15 deletions(-)
+
+diff --git a/io_uring.c b/io_uring.c
+index cd183457..cfeea82b 100644
+--- a/io_uring.c
++++ b/io_uring.c
+@@ -18,21 +18,6 @@
+ #include "xlat/uring_enter_flags.h"
+ #include "xlat/uring_register_opcodes.h"
+
+-#ifdef HAVE_STRUCT_IO_CQRING_OFFSETS
+-# ifdef HAVE_STRUCT_IO_CQRING_OFFSETS_RESV
+-static_assert(offsetof(struct_io_cqring_offsets, resv)
+- >= offsetof(struct io_cqring_offsets, resv),
+- "struct io_cqring_offsets.resv offset mismatch"
+- ", please update the decoder");
+-static_assert(sizeof_field(struct_io_cqring_offsets, resv)
+- <= sizeof_field(struct io_cqring_offsets, resv),
+- "struct io_cqring_offsets.resv size mismatch"
+- ", please update the decoder");
+-# else /* !HAVE_STRUCT_IO_CQRING_OFFSETS_RESV */
+-static_assert(0, "struct io_cqring_offsets.resv is missing"
+- ", please update the decoder");
+-# endif
+-#endif /* HAVE_STRUCT_IO_CQRING_OFFSETS */
+ #ifdef HAVE_STRUCT_IO_URING_PARAMS
+ # ifdef HAVE_STRUCT_IO_URING_PARAMS_RESV
+ static_assert(offsetof(struct_io_uring_params, resv)
+--
+2.28.0
+
diff --git a/pkg/strace/patch/0013-io_uring-Add-io_cqring_offset-flags.patch b/pkg/strace/patch/0013-io_uring-Add-io_cqring_offset-flags.patch
@@ -0,0 +1,208 @@
+From 7be4c3c00f7b7568b4c7602e8430e90d2df91e3b Mon Sep 17 00:00:00 2001
+From: Chris Packham <chris.packham@alliedtelesis.co.nz>
+Date: Mon, 15 Jun 2020 22:01:26 +1200
+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.
+
+Co-authored-by: Dmitry V. Levin <ldv@altlinux.org>
+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.h | 48 ++++++++++++++++++++++++++++++++++++++
+ xlat/uring_cqring_flags.in | 1 +
+ 6 files changed, 86 insertions(+), 10 deletions(-)
+ create mode 100644 xlat/uring_cqring_flags.h
+ create mode 100644 xlat/uring_cqring_flags.in
+
+diff --git a/configure.ac b/configure.ac
+index d0fd51ff..91c2249e 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -481,6 +481,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 cfeea82b..2ffe163e 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_URING_PARAMS
+ # ifdef HAVE_STRUCT_IO_URING_PARAMS_RESV
+@@ -88,10 +89,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 317b0d7a..a59e4a1a 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<anon_inode:[io_uring]>\n", rc);
+ }
+diff --git a/types/io_uring.h b/types/io_uring.h
+index 76f432c3..2fe1c13a 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.h b/xlat/uring_cqring_flags.h
+new file mode 100644
+index 00000000..7c06c35c
+--- /dev/null
++++ b/xlat/uring_cqring_flags.h
+@@ -0,0 +1,48 @@
++/* Generated by ./gen.sh from ./uring_cqring_flags.in; do not edit. */
++
++#include "gcc_compat.h"
++#include "static_assert.h"
++
++#if defined(IORING_CQ_EVENTFD_DISABLED) || (defined(HAVE_DECL_IORING_CQ_EVENTFD_DISABLED) && HAVE_DECL_IORING_CQ_EVENTFD_DISABLED)
++DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
++static_assert((IORING_CQ_EVENTFD_DISABLED) == (1U), "IORING_CQ_EVENTFD_DISABLED != 1U");
++DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
++#else
++# define IORING_CQ_EVENTFD_DISABLED 1U
++#endif
++
++#ifndef XLAT_MACROS_ONLY
++
++# ifdef IN_MPERS
++
++# error static const struct xlat uring_cqring_flags in mpers mode
++
++# else
++
++static const struct xlat_data uring_cqring_flags_xdata[] = {
++ XLAT(IORING_CQ_EVENTFD_DISABLED),
++ #define XLAT_VAL_0 ((unsigned) (IORING_CQ_EVENTFD_DISABLED))
++ #define XLAT_STR_0 STRINGIFY(IORING_CQ_EVENTFD_DISABLED)
++};
++static
++const struct xlat uring_cqring_flags[1] = { {
++ .data = uring_cqring_flags_xdata,
++ .size = ARRAY_SIZE(uring_cqring_flags_xdata),
++ .type = XT_NORMAL,
++ .flags_mask = 0
++# ifdef XLAT_VAL_0
++ | XLAT_VAL_0
++# endif
++ ,
++ .flags_strsz = 0
++# ifdef XLAT_STR_0
++ + sizeof(XLAT_STR_0)
++# endif
++ ,
++} };
++
++# undef XLAT_STR_0
++# undef XLAT_VAL_0
++# endif /* !IN_MPERS */
++
++#endif /* !XLAT_MACROS_ONLY */
+diff --git a/xlat/uring_cqring_flags.in b/xlat/uring_cqring_flags.in
+new file mode 100644
+index 00000000..c81fbc20
+--- /dev/null
++++ b/xlat/uring_cqring_flags.in
+@@ -0,0 +1 @@
++IORING_CQ_EVENTFD_DISABLED 1U
+--
+2.28.0
+
diff --git a/pkg/strace/ver b/pkg/strace/ver
@@ -1 +1 @@
-5.7 r0
+5.7 r1