tracing: Move event storage for array from macro to standalone function
The code that shows array fields for events is defined for all events. This can add up quite a bit when you have over 500 events. By making helper functions in the core kernel to do the work instead, we can shrink the size of the kernel down a bit. With a kernel configured with 502 events, the change in size was: text data bss dec hex filename 12990946 1913568 9785344 24689858 178bcc2 /tmp/vmlinux 12987390 1913504 9785344 24686238 178ae9e /tmp/vmlinux.patched That's a total of 3556 bytes, which comes down to 7 bytes per event. Although it's not much, this code is just called at initialization of the events. Link: http://lkml.kernel.org/r/20120810034708.084036335@goodmis.org Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									1d6bae966e
								
							
						
					
					
						commit
						35bb4399bd
					
				| @ -202,6 +202,10 @@ extern int ftrace_event_reg(struct ftrace_event_call *event, | ||||
| int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event, | ||||
| 			char *fmt, ...); | ||||
| 
 | ||||
| int ftrace_event_define_field(struct ftrace_event_call *call, | ||||
| 			      char *type, int len, char *item, int offset, | ||||
| 			      int field_size, int sign, int filter); | ||||
| 
 | ||||
| enum { | ||||
| 	TRACE_EVENT_FL_FILTERED_BIT, | ||||
| 	TRACE_EVENT_FL_CAP_ANY_BIT, | ||||
| @ -500,10 +504,6 @@ enum { | ||||
| 	FILTER_TRACE_FN, | ||||
| }; | ||||
| 
 | ||||
| #define EVENT_STORAGE_SIZE 128 | ||||
| extern struct mutex event_storage_mutex; | ||||
| extern char event_storage[EVENT_STORAGE_SIZE]; | ||||
| 
 | ||||
| extern int trace_event_raw_init(struct ftrace_event_call *call); | ||||
| extern int trace_define_field(struct ftrace_event_call *call, const char *type, | ||||
| 			      const char *name, int offset, int size, | ||||
|  | ||||
| @ -302,15 +302,11 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = {	\ | ||||
| #undef __array | ||||
| #define __array(type, item, len)					\ | ||||
| 	do {								\ | ||||
| 		mutex_lock(&event_storage_mutex);			\ | ||||
| 		BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);			\ | ||||
| 		snprintf(event_storage, sizeof(event_storage),		\ | ||||
| 			 "%s[%d]", #type, len);				\ | ||||
| 		ret = trace_define_field(event_call, event_storage, #item, \ | ||||
| 				 offsetof(typeof(field), item),		\ | ||||
| 				 sizeof(field.item),			\ | ||||
| 				 is_signed_type(type), FILTER_OTHER);	\ | ||||
| 		mutex_unlock(&event_storage_mutex);			\ | ||||
| 		ret = ftrace_event_define_field(event_call, #type, len,	\ | ||||
| 				#item, offsetof(typeof(field), item),   \ | ||||
| 				sizeof(field.item),			\ | ||||
| 			 	is_signed_type(type), FILTER_OTHER); \ | ||||
| 		if (ret)						\ | ||||
| 			return ret;					\ | ||||
| 	} while (0); | ||||
|  | ||||
| @ -27,12 +27,6 @@ | ||||
| 
 | ||||
| DEFINE_MUTEX(event_mutex); | ||||
| 
 | ||||
| DEFINE_MUTEX(event_storage_mutex); | ||||
| EXPORT_SYMBOL_GPL(event_storage_mutex); | ||||
| 
 | ||||
| char event_storage[EVENT_STORAGE_SIZE]; | ||||
| EXPORT_SYMBOL_GPL(event_storage); | ||||
| 
 | ||||
| LIST_HEAD(ftrace_events); | ||||
| static LIST_HEAD(ftrace_common_fields); | ||||
| 
 | ||||
|  | ||||
| @ -96,14 +96,10 @@ static void __always_unused ____ftrace_check_##name(void)		\ | ||||
| #define __array(type, item, len)					\ | ||||
| 	do {								\ | ||||
| 		BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);			\ | ||||
| 		mutex_lock(&event_storage_mutex);			\ | ||||
| 		snprintf(event_storage, sizeof(event_storage),		\ | ||||
| 			 "%s[%d]", #type, len);				\ | ||||
| 		ret = trace_define_field(event_call, event_storage, #item, \ | ||||
| 				 offsetof(typeof(field), item),		\ | ||||
| 				 sizeof(field.item),			\ | ||||
| 				 is_signed_type(type), filter_type);	\ | ||||
| 		mutex_unlock(&event_storage_mutex);			\ | ||||
| 		ret = ftrace_event_define_field(event_call, #type, len,	\ | ||||
| 				#item, offsetof(typeof(field), item),   \ | ||||
| 				sizeof(field.item),			\ | ||||
| 			 	is_signed_type(type), filter_type);	\ | ||||
| 		if (ret)						\ | ||||
| 			return ret;					\ | ||||
| 	} while (0); | ||||
|  | ||||
| @ -20,6 +20,10 @@ static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly; | ||||
| 
 | ||||
| static int next_event_type = __TRACE_LAST_TYPE + 1; | ||||
| 
 | ||||
| #define EVENT_STORAGE_SIZE 128 | ||||
| static DEFINE_MUTEX(event_storage_mutex); | ||||
| static char event_storage[EVENT_STORAGE_SIZE]; | ||||
| 
 | ||||
| int trace_print_seq(struct seq_file *m, struct trace_seq *s) | ||||
| { | ||||
| 	int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len; | ||||
| @ -470,6 +474,23 @@ int ftrace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...) | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(ftrace_output_call); | ||||
| 
 | ||||
| int ftrace_event_define_field(struct ftrace_event_call *call, | ||||
| 			      char *type, int len, char *item, int offset, | ||||
| 			      int field_size, int sign, int filter) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	mutex_lock(&event_storage_mutex); | ||||
| 	snprintf(event_storage, sizeof(event_storage), | ||||
| 		 "%s[%d]", type, len); | ||||
| 	ret = trace_define_field(call, event_storage, item, offset, | ||||
| 				 field_size, sign, filter); | ||||
| 	mutex_unlock(&event_storage_mutex); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(ftrace_event_define_field); | ||||
| 
 | ||||
| #ifdef CONFIG_KRETPROBES | ||||
| static inline const char *kretprobed(const char *name) | ||||
| { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user