Commit bab849a9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull tracing fix from Steven Rostedt:

 - Fix event format field alignments for 32 bit architectures

   The fields in the event format files are used to parse the raw binary
   buffer data by applications. If they are incorrect, then the
   application produces garbage.

   On 32 bit architectures, the function graph 64bit calltime and
   rettime were off by 4bytes. That's because the actual fields are in a
   packed structure but the macros used by the ftrace events did not
   mark them as packed, and instead, gave them their natural alignment
   which made their offsets off by 4 bytes.

   There are macros to have a packed field within an embedded structure
   of an event, but there's no macro for normal fields within a packed
   structure of the event. The macro __field_packed() was used for the
   packed embedded structure field. Rename that to __field_desc_packed()
   (to match the non-packed embedded field macro __field_desc()), and
   make __field_packed() for fields that are in a packed event structure
   (which matches the unpacked __field() macro).

   Switch the calltime and rettime fields of the function graph event to
   use the new __field_packed() and this makes the offsets correct.

* tag 'trace-v6.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  tracing: Fix ftrace event field alignments
parents 240b8d82 033c55fe
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -68,14 +68,17 @@ enum trace_type {
#undef __field_fn
#define __field_fn(type, item)		type	item;

#undef __field_packed
#define __field_packed(type, item)	type	item;

#undef __field_struct
#define __field_struct(type, item)	__field(type, item)

#undef __field_desc
#define __field_desc(type, container, item)

#undef __field_packed
#define __field_packed(type, container, item)
#undef __field_desc_packed
#define __field_desc_packed(type, container, item)

#undef __array
#define __array(type, item, size)	type	item[size];
+16 −16
Original line number Diff line number Diff line
@@ -79,8 +79,8 @@ FTRACE_ENTRY(funcgraph_entry, ftrace_graph_ent_entry,

	F_STRUCT(
		__field_struct(	struct ftrace_graph_ent,	graph_ent	)
		__field_packed(	unsigned long,	graph_ent,	func		)
		__field_packed(	unsigned long,	graph_ent,	depth		)
		__field_desc_packed(unsigned long,	graph_ent,	func	)
		__field_desc_packed(unsigned long,	graph_ent,	depth	)
		__dynamic_array(unsigned long,	args				)
	),

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

	F_STRUCT(
		__field_struct(	struct fgraph_retaddr_ent,	graph_rent	)
		__field_packed(	unsigned long,	graph_rent.ent,	func		)
		__field_packed(	unsigned long,	graph_rent.ent,	depth		)
		__field_packed(	unsigned long,	graph_rent,	retaddr		)
		__field_desc_packed(	unsigned long,	graph_rent.ent,	func	)
		__field_desc_packed(	unsigned long,	graph_rent.ent,	depth	)
		__field_desc_packed(	unsigned long,	graph_rent,	retaddr	)
		__dynamic_array(unsigned long,	args				)
	),

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

	F_STRUCT(
		__field_struct(	struct ftrace_graph_ret,	ret	)
		__field_packed(	unsigned long,	ret,		func	)
		__field_packed(	unsigned long,	ret,		retval	)
		__field_packed(	unsigned int,	ret,		depth	)
		__field_packed(	unsigned int,	ret,		overrun	)
		__field(unsigned long long,	calltime		)
		__field(unsigned long long,	rettime			)
		__field_desc_packed(	unsigned long,	ret,	func	)
		__field_desc_packed(	unsigned long,	ret,	retval	)
		__field_desc_packed(	unsigned int,	ret,	depth	)
		__field_desc_packed(	unsigned int,	ret,	overrun	)
		__field_packed(unsigned long long,	calltime)
		__field_packed(unsigned long long,	rettime	)
	),

	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,

	F_STRUCT(
		__field_struct(	struct ftrace_graph_ret,	ret	)
		__field_packed(	unsigned long,	ret,		func	)
		__field_packed(	unsigned int,	ret,		depth	)
		__field_packed(	unsigned int,	ret,		overrun	)
		__field(unsigned long long,	calltime		)
		__field(unsigned long long,	rettime			)
		__field_desc_packed(	unsigned long,	ret,	func	)
		__field_desc_packed(	unsigned int,	ret,	depth	)
		__field_desc_packed(	unsigned int,	ret,	overrun	)
		__field_packed(unsigned long long,	calltime	)
		__field_packed(unsigned long long,	rettime		)
	),

	F_printk("<-- %ps (%u) (start: %llx  end: %llx) over: %u",
+15 −6
Original line number Diff line number Diff line
@@ -42,11 +42,14 @@ static int ftrace_event_register(struct trace_event_call *call,
#undef __field_fn
#define __field_fn(type, item)				type item;

#undef __field_packed
#define __field_packed(type, item)			type item;

#undef __field_desc
#define __field_desc(type, container, item)		type item;

#undef __field_packed
#define __field_packed(type, container, item)		type item;
#undef __field_desc_packed
#define __field_desc_packed(type, container, item)	type item;

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

#undef __field_packed
#define __field_packed(_type, _item) __field_ext_packed(_type, _item, FILTER_OTHER)

#undef __field_desc
#define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)

#undef __field_packed
#define __field_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
#undef __field_desc_packed
#define __field_desc_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)

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

#undef __field_packed
#define __field_packed(type, item)

#undef __field_desc
#define __field_desc(type, container, item)

#undef __field_packed
#define __field_packed(type, container, item)
#undef __field_desc_packed
#define __field_desc_packed(type, container, item)

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