Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9a57763 authored by Steven Rostedt's avatar Steven Rostedt Committed by Steven Rostedt
Browse files

tracing: Allow events to share their print functions



Multiple events may use the same method to print their data.
Instead of having all events have a pointer to their print funtions,
the trace_event structure now points to a trace_event_functions structure
that will hold the way to print ouf the event.

The event itself is now passed to the print function to let the print
function know what kind of event it should print.

This opens the door to consolidating the way several events print
their output.

   text	   data	    bss	    dec	    hex	filename
4913961	1088356	 861512	6863829	 68bbd5	vmlinux.orig
4900382	1048964	 861512	6810858	 67ecea	vmlinux.init
4900446	1049028	 861512	6810986	 67ed6a	vmlinux.preprint

This change slightly increases the size but is needed for the next change.

v3: Fix the branch tracer events to handle this change.

v2: Fix the new function graph tracer event calls to handle this change.

Acked-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: default avatarMasami Hiramatsu <mhiramat@redhat.com>
Acked-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 0405ab80
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -70,18 +70,25 @@ struct trace_iterator {
};


struct trace_event;

typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
					      int flags);
struct trace_event {
	struct hlist_node	node;
	struct list_head	list;
	int			type;
				      int flags, struct trace_event *event);

struct trace_event_functions {
	trace_print_func	trace;
	trace_print_func	raw;
	trace_print_func	hex;
	trace_print_func	binary;
};

struct trace_event {
	struct hlist_node		node;
	struct list_head		list;
	int				type;
	struct trace_event_functions	*funcs;
};

extern int register_ftrace_event(struct trace_event *event);
extern int unregister_ftrace_event(struct trace_event *event);

+8 −2
Original line number Diff line number Diff line
@@ -125,9 +125,12 @@ extern struct ftrace_event_class event_class_syscall_exit;
	static struct syscall_metadata __syscall_meta_##sname;		\
	static struct ftrace_event_call					\
	__attribute__((__aligned__(4))) event_enter_##sname;		\
	static struct trace_event enter_syscall_print_##sname = {	\
	static struct trace_event_functions enter_syscall_print_funcs_##sname = { \
		.trace                  = print_syscall_enter,		\
	};								\
	static struct trace_event enter_syscall_print_##sname = {	\
		.funcs                  = &enter_syscall_print_funcs_##sname, \
	};								\
	static struct ftrace_event_call __used				\
	  __attribute__((__aligned__(4)))				\
	  __attribute__((section("_ftrace_events")))			\
@@ -142,9 +145,12 @@ extern struct ftrace_event_class event_class_syscall_exit;
	static struct syscall_metadata __syscall_meta_##sname;		\
	static struct ftrace_event_call					\
	__attribute__((__aligned__(4))) event_exit_##sname;		\
	static struct trace_event exit_syscall_print_##sname = {	\
	static struct trace_event_functions exit_syscall_print_funcs_##sname = { \
		.trace                  = print_syscall_exit,		\
	};								\
	static struct trace_event exit_syscall_print_##sname = {	\
		.funcs                  = &exit_syscall_print_funcs_##sname, \
	};								\
	static struct ftrace_event_call __used				\
	  __attribute__((__aligned__(4)))				\
	  __attribute__((section("_ftrace_events")))			\
+8 −5
Original line number Diff line number Diff line
@@ -239,7 +239,8 @@ ftrace_raw_output_id_##call(int event_id, const char *name, \
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args)			\
static notrace enum print_line_t					\
ftrace_raw_output_##name(struct trace_iterator *iter, int flags)	\
ftrace_raw_output_##name(struct trace_iterator *iter, int flags,	\
			 struct trace_event *event)			\
{									\
	return ftrace_raw_output_id_##template(event_##name.id,		\
					       #name, iter, flags);	\
@@ -248,7 +249,8 @@ ftrace_raw_output_##name(struct trace_iterator *iter, int flags) \
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, call, proto, args, print)		\
static notrace enum print_line_t					\
ftrace_raw_output_##call(struct trace_iterator *iter, int flags)	\
ftrace_raw_output_##call(struct trace_iterator *iter, int flags,	\
			 struct trace_event *event)			\
{									\
	struct trace_seq *s = &iter->seq;				\
	struct ftrace_raw_##template *field;				\
@@ -531,11 +533,12 @@ ftrace_raw_event_##call(void *__data, proto) \

#undef DEFINE_EVENT
#define DEFINE_EVENT(template, call, proto, args)			\
									\
static struct trace_event ftrace_event_type_##call = {			\
static struct trace_event_functions ftrace_event_type_funcs_##call = {	\
	.trace			= ftrace_raw_output_##call,		\
};									\
									\
static struct trace_event ftrace_event_type_##call = {			\
	.funcs			= &ftrace_event_type_funcs_##call,	\
};									\
static inline void ftrace_test_probe_##call(void)			\
{									\
	check_trace_callback_type_##call(ftrace_raw_event_##template);	\
+4 −2
Original line number Diff line number Diff line
@@ -42,8 +42,10 @@ extern int reg_event_syscall_exit(struct ftrace_event_call *call);
extern void unreg_event_syscall_exit(struct ftrace_event_call *call);
extern int
ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s);
enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags);
enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags);
enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags,
				      struct trace_event *event);
enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags,
				     struct trace_event *event);
#endif

#ifdef CONFIG_PERF_EVENTS
+9 −4
Original line number Diff line number Diff line
@@ -1336,7 +1336,7 @@ static enum print_line_t print_one_line(struct trace_iterator *iter,
}

static enum print_line_t blk_trace_event_print(struct trace_iterator *iter,
					       int flags)
					       int flags, struct trace_event *event)
{
	return print_one_line(iter, false);
}
@@ -1358,7 +1358,8 @@ static int blk_trace_synthesize_old_trace(struct trace_iterator *iter)
}

static enum print_line_t
blk_trace_event_print_binary(struct trace_iterator *iter, int flags)
blk_trace_event_print_binary(struct trace_iterator *iter, int flags,
			     struct trace_event *event)
{
	return blk_trace_synthesize_old_trace(iter) ?
			TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
@@ -1396,12 +1397,16 @@ static struct tracer blk_tracer __read_mostly = {
	.set_flag	= blk_tracer_set_flag,
};

static struct trace_event trace_blk_event = {
	.type		= TRACE_BLK,
static struct trace_event_functions trace_blk_event_funcs = {
	.trace		= blk_trace_event_print,
	.binary		= blk_trace_event_print_binary,
};

static struct trace_event trace_blk_event = {
	.type		= TRACE_BLK,
	.funcs		= &trace_blk_event_funcs,
};

static int __init init_blk_tracer(void)
{
	if (!register_ftrace_event(&trace_blk_event)) {
Loading