mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	tracing: Add a helper function for event print functions
Move duplicate code in event print functions to a helper function.
This shrinks the size of the kernel by ~13K.
   text    data     bss     dec     hex filename
6596137 1743966 10138672        18478775        119f6b7 vmlinux.o.old
6583002 1743849 10138672        18465523        119c2f3 vmlinux.o.new
Link: http://lkml.kernel.org/r/51258746.2060304@huawei.com
Signed-off-by: Li Zefan <lizefan@huawei.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
			
			
This commit is contained in:
		
							parent
							
								
									15693458c4
								
							
						
					
					
						commit
						f71130de5c
					
				
					 3 changed files with 38 additions and 19 deletions
				
			
		| 
						 | 
					@ -38,6 +38,12 @@ const char *ftrace_print_symbols_seq_u64(struct trace_seq *p,
 | 
				
			||||||
const char *ftrace_print_hex_seq(struct trace_seq *p,
 | 
					const char *ftrace_print_hex_seq(struct trace_seq *p,
 | 
				
			||||||
				 const unsigned char *buf, int len);
 | 
									 const unsigned char *buf, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct trace_iterator;
 | 
				
			||||||
 | 
					struct trace_event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ftrace_raw_output_prep(struct trace_iterator *iter,
 | 
				
			||||||
 | 
								   struct trace_event *event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The trace entry - the most basic unit of tracing. This is what
 | 
					 * The trace entry - the most basic unit of tracing. This is what
 | 
				
			||||||
 * is printed in the end as a single line in the trace output, such as:
 | 
					 * is printed in the end as a single line in the trace output, such as:
 | 
				
			||||||
| 
						 | 
					@ -95,8 +101,6 @@ enum trace_iter_flags {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct trace_event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
 | 
					typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
 | 
				
			||||||
				      int flags, struct trace_event *event);
 | 
									      int flags, struct trace_event *event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,28 +227,17 @@ 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 *trace_event)		\
 | 
								 struct trace_event *trace_event)		\
 | 
				
			||||||
{									\
 | 
					{									\
 | 
				
			||||||
	struct ftrace_event_call *event;				\
 | 
					 | 
				
			||||||
	struct trace_seq *s = &iter->seq;				\
 | 
						struct trace_seq *s = &iter->seq;				\
 | 
				
			||||||
 | 
						struct trace_seq __maybe_unused *p = &iter->tmp_seq;		\
 | 
				
			||||||
	struct ftrace_raw_##call *field;				\
 | 
						struct ftrace_raw_##call *field;				\
 | 
				
			||||||
	struct trace_entry *entry;					\
 | 
					 | 
				
			||||||
	struct trace_seq *p = &iter->tmp_seq;				\
 | 
					 | 
				
			||||||
	int ret;							\
 | 
						int ret;							\
 | 
				
			||||||
									\
 | 
														\
 | 
				
			||||||
	event = container_of(trace_event, struct ftrace_event_call,	\
 | 
						field = (typeof(field))iter->ent;				\
 | 
				
			||||||
			     event);					\
 | 
					 | 
				
			||||||
									\
 | 
														\
 | 
				
			||||||
	entry = iter->ent;						\
 | 
						ret = ftrace_raw_output_prep(iter, trace_event);		\
 | 
				
			||||||
									\
 | 
					 | 
				
			||||||
	if (entry->type != event->event.type) {				\
 | 
					 | 
				
			||||||
		WARN_ON_ONCE(1);					\
 | 
					 | 
				
			||||||
		return TRACE_TYPE_UNHANDLED;				\
 | 
					 | 
				
			||||||
	}								\
 | 
					 | 
				
			||||||
									\
 | 
					 | 
				
			||||||
	field = (typeof(field))entry;					\
 | 
					 | 
				
			||||||
									\
 | 
					 | 
				
			||||||
	trace_seq_init(p);						\
 | 
					 | 
				
			||||||
	ret = trace_seq_printf(s, "%s: ", event->name);			\
 | 
					 | 
				
			||||||
	if (ret)							\
 | 
						if (ret)							\
 | 
				
			||||||
 | 
							return ret;						\
 | 
				
			||||||
 | 
														\
 | 
				
			||||||
	ret = trace_seq_printf(s, print);				\
 | 
						ret = trace_seq_printf(s, print);				\
 | 
				
			||||||
	if (!ret)							\
 | 
						if (!ret)							\
 | 
				
			||||||
		return TRACE_TYPE_PARTIAL_LINE;				\
 | 
							return TRACE_TYPE_PARTIAL_LINE;				\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -397,6 +397,32 @@ ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(ftrace_print_hex_seq);
 | 
					EXPORT_SYMBOL(ftrace_print_hex_seq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ftrace_raw_output_prep(struct trace_iterator *iter,
 | 
				
			||||||
 | 
								   struct trace_event *trace_event)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct ftrace_event_call *event;
 | 
				
			||||||
 | 
						struct trace_seq *s = &iter->seq;
 | 
				
			||||||
 | 
						struct trace_seq *p = &iter->tmp_seq;
 | 
				
			||||||
 | 
						struct trace_entry *entry;
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						event = container_of(trace_event, struct ftrace_event_call, event);
 | 
				
			||||||
 | 
						entry = iter->ent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (entry->type != event->event.type) {
 | 
				
			||||||
 | 
							WARN_ON_ONCE(1);
 | 
				
			||||||
 | 
							return TRACE_TYPE_UNHANDLED;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						trace_seq_init(p);
 | 
				
			||||||
 | 
						ret = trace_seq_printf(s, "%s: ", event->name);
 | 
				
			||||||
 | 
						if (!ret)
 | 
				
			||||||
 | 
							return TRACE_TYPE_PARTIAL_LINE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(ftrace_raw_output_prep);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_KRETPROBES
 | 
					#ifdef CONFIG_KRETPROBES
 | 
				
			||||||
static inline const char *kretprobed(const char *name)
 | 
					static inline const char *kretprobed(const char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue