Skip to content

Commit 033c55f

Browse files
committed
tracing: Fix ftrace event field alignments
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 some of the ftrace event structures are packed. The function graph exit event structures are one of them. The 64 bit calltime and rettime fields end up 4 byte aligned, but the algorithm to show to userspace shows them as 8 byte aligned. The macros that create the ftrace events has one for embedded structure fields. There's two macros for theses fields: __field_desc() and __field_packed() The difference of the latter macro is that it treats the field as packed. Rename that field to __field_desc_packed() and create replace the __field_packed() to be a normal field that is packed and have the calltime and rettime use those. This showed up on 32bit architectures for function graph time fields. It had: ~# cat /sys/kernel/tracing/events/ftrace/funcgraph_exit/format [..] field:unsigned long func; offset:8; size:4; signed:0; field:unsigned int depth; offset:12; size:4; signed:0; field:unsigned int overrun; offset:16; size:4; signed:0; field:unsigned long long calltime; offset:24; size:8; signed:0; field:unsigned long long rettime; offset:32; size:8; signed:0; Notice that overrun is at offset 16 with size 4, where in the structure calltime is at offset 20 (16 + 4), but it shows the offset at 24. That's because it used the alignment of unsigned long long when used as a declaration and not as a member of a structure where it would be aligned by word size (in this case 4). By using the proper structure alignment, the format has it at the correct offset: ~# cat /sys/kernel/tracing/events/ftrace/funcgraph_exit/format [..] field:unsigned long func; offset:8; size:4; signed:0; field:unsigned int depth; offset:12; size:4; signed:0; field:unsigned int overrun; offset:16; size:4; signed:0; field:unsigned long long calltime; offset:20; size:8; signed:0; field:unsigned long long rettime; offset:28; size:8; signed:0; Cc: stable@vger.kernel.org Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Mark Rutland <mark.rutland@arm.com> Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Reported-by: "jempty.liang" <imntjempty@163.com> Link: https://patch.msgid.link/20260204113628.53faec78@gandalf.local.home Fixes: 04ae87a ("ftrace: Rework event_create_dir()") Closes: https://lore.kernel.org/all/20260130015740.212343-1-imntjempty@163.com/ Closes: https://lore.kernel.org/all/20260202123342.2544795-1-imntjempty@163.com/ Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent 361eb85 commit 033c55f

3 files changed

Lines changed: 36 additions & 24 deletions

File tree

kernel/trace/trace.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,17 @@ enum trace_type {
6868
#undef __field_fn
6969
#define __field_fn(type, item) type item;
7070

71+
#undef __field_packed
72+
#define __field_packed(type, item) type item;
73+
7174
#undef __field_struct
7275
#define __field_struct(type, item) __field(type, item)
7376

7477
#undef __field_desc
7578
#define __field_desc(type, container, item)
7679

77-
#undef __field_packed
78-
#define __field_packed(type, container, item)
80+
#undef __field_desc_packed
81+
#define __field_desc_packed(type, container, item)
7982

8083
#undef __array
8184
#define __array(type, item, size) type item[size];

kernel/trace/trace_entries.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ FTRACE_ENTRY(funcgraph_entry, ftrace_graph_ent_entry,
7979

8080
F_STRUCT(
8181
__field_struct( struct ftrace_graph_ent, graph_ent )
82-
__field_packed( unsigned long, graph_ent, func )
83-
__field_packed( unsigned long, graph_ent, depth )
82+
__field_desc_packed(unsigned long, graph_ent, func )
83+
__field_desc_packed(unsigned long, graph_ent, depth )
8484
__dynamic_array(unsigned long, args )
8585
),
8686

@@ -96,9 +96,9 @@ FTRACE_ENTRY_PACKED(fgraph_retaddr_entry, fgraph_retaddr_ent_entry,
9696

9797
F_STRUCT(
9898
__field_struct( struct fgraph_retaddr_ent, graph_rent )
99-
__field_packed( unsigned long, graph_rent.ent, func )
100-
__field_packed( unsigned long, graph_rent.ent, depth )
101-
__field_packed( unsigned long, graph_rent, retaddr )
99+
__field_desc_packed( unsigned long, graph_rent.ent, func )
100+
__field_desc_packed( unsigned long, graph_rent.ent, depth )
101+
__field_desc_packed( unsigned long, graph_rent, retaddr )
102102
__dynamic_array(unsigned long, args )
103103
),
104104

@@ -123,12 +123,12 @@ FTRACE_ENTRY_PACKED(funcgraph_exit, ftrace_graph_ret_entry,
123123

124124
F_STRUCT(
125125
__field_struct( struct ftrace_graph_ret, ret )
126-
__field_packed( unsigned long, ret, func )
127-
__field_packed( unsigned long, ret, retval )
128-
__field_packed( unsigned int, ret, depth )
129-
__field_packed( unsigned int, ret, overrun )
130-
__field(unsigned long long, calltime )
131-
__field(unsigned long long, rettime )
126+
__field_desc_packed( unsigned long, ret, func )
127+
__field_desc_packed( unsigned long, ret, retval )
128+
__field_desc_packed( unsigned int, ret, depth )
129+
__field_desc_packed( unsigned int, ret, overrun )
130+
__field_packed(unsigned long long, calltime)
131+
__field_packed(unsigned long long, rettime )
132132
),
133133

134134
F_printk("<-- %ps (%u) (start: %llx end: %llx) over: %u retval: %lx",
@@ -146,11 +146,11 @@ FTRACE_ENTRY_PACKED(funcgraph_exit, ftrace_graph_ret_entry,
146146

147147
F_STRUCT(
148148
__field_struct( struct ftrace_graph_ret, ret )
149-
__field_packed( unsigned long, ret, func )
150-
__field_packed( unsigned int, ret, depth )
151-
__field_packed( unsigned int, ret, overrun )
152-
__field(unsigned long long, calltime )
153-
__field(unsigned long long, rettime )
149+
__field_desc_packed( unsigned long, ret, func )
150+
__field_desc_packed( unsigned int, ret, depth )
151+
__field_desc_packed( unsigned int, ret, overrun )
152+
__field_packed(unsigned long long, calltime )
153+
__field_packed(unsigned long long, rettime )
154154
),
155155

156156
F_printk("<-- %ps (%u) (start: %llx end: %llx) over: %u",

kernel/trace/trace_export.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@ static int ftrace_event_register(struct trace_event_call *call,
4242
#undef __field_fn
4343
#define __field_fn(type, item) type item;
4444

45+
#undef __field_packed
46+
#define __field_packed(type, item) type item;
47+
4548
#undef __field_desc
4649
#define __field_desc(type, container, item) type item;
4750

48-
#undef __field_packed
49-
#define __field_packed(type, container, item) type item;
51+
#undef __field_desc_packed
52+
#define __field_desc_packed(type, container, item) type item;
5053

5154
#undef __array
5255
#define __array(type, item, size) type item[size];
@@ -104,11 +107,14 @@ static void __always_unused ____ftrace_check_##name(void) \
104107
#undef __field_fn
105108
#define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
106109

110+
#undef __field_packed
111+
#define __field_packed(_type, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
112+
107113
#undef __field_desc
108114
#define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
109115

110-
#undef __field_packed
111-
#define __field_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
116+
#undef __field_desc_packed
117+
#define __field_desc_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
112118

113119
#undef __array
114120
#define __array(_type, _item, _len) { \
@@ -146,11 +152,14 @@ static struct trace_event_fields ftrace_event_fields_##name[] = { \
146152
#undef __field_fn
147153
#define __field_fn(type, item)
148154

155+
#undef __field_packed
156+
#define __field_packed(type, item)
157+
149158
#undef __field_desc
150159
#define __field_desc(type, container, item)
151160

152-
#undef __field_packed
153-
#define __field_packed(type, container, item)
161+
#undef __field_desc_packed
162+
#define __field_desc_packed(type, container, item)
154163

155164
#undef __array
156165
#define __array(type, item, len)

0 commit comments

Comments
 (0)