From: Steven Rostedt <[email protected]>

The fields of ftrace specific events (events used to save ftrace internal
events like function traces and trace_printk) are generated similarly to
how normal trace event fields are generated. That is, the fields are added
to a trace_events_fields array that saves the name, offset, size,
alignment and signness of the field. It is used to produce the output in
the format file in tracefs so that tooling knows how to parse the binary
data of the trace events.

The issue is that the macro to determine the alignment of a field used the
alignment of the type when used normally, but not when it is used within a
structure.

This was fixed for normal trace event fields via: 4c3d2f9388d36 ("tracing:
Use a struct alignof to determine trace event field alignment"), but was
missed for the ftrace specific events.

Do the same for ftrace specific events by creating a helper macro:

 #define ALIGN_STRUCTFIELD(type) ((int)(__alignof__(struct {type b;})))

and use that as the alignment of types within the ftrace event structures.

Cc: [email protected]
Fixes: 04ae87a52074e ("ftrace: Rework event_create_dir()")
Reported-by: "jempty.liang" <[email protected]>
Closes: https://lore.kernel.org/all/[email protected]/
Closes: https://lore.kernel.org/all/[email protected]/
Signed-off-by: Steven Rostedt (Google) <[email protected]>
---
 kernel/trace/trace_export.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c
index 1698fc22afa0..5b96ac750049 100644
--- a/kernel/trace/trace_export.c
+++ b/kernel/trace/trace_export.c
@@ -14,6 +14,9 @@
 
 #include "trace_output.h"
 
+/* The alignment of a type when in a structure */
+#define ALIGN_STRUCTFIELD(type) ((int)(__alignof__(struct {type b;})))
+
 /* Stub function for events with triggers */
 static int ftrace_event_register(struct trace_event_call *call,
                                 enum trace_reg type, void *data)
@@ -88,7 +91,7 @@ static void __always_unused ____ftrace_check_##name(void)     
        \
 #undef __field_ext
 #define __field_ext(_type, _item, _filter_type) {                      \
        .type = #_type, .name = #_item,                                 \
-       .size = sizeof(_type), .align = __alignof__(_type),             \
+       .size = sizeof(_type), .align = ALIGN_STRUCTFIELD(_type),       \
        is_signed_type(_type), .filter_type = _filter_type },
 
 
-- 
2.51.0


Reply via email to