diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
| -rw-r--r-- | kernel/trace/trace_events.c | 52 | 
1 files changed, 35 insertions, 17 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 33e0b4f8ebe6..654ffa40457a 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -114,7 +114,7 @@ trace_find_event_field(struct trace_event_call *call, char *name)  static int __trace_define_field(struct list_head *head, const char *type,  				const char *name, int offset, int size, -				int is_signed, int filter_type) +				int is_signed, int filter_type, int len)  {  	struct ftrace_event_field *field; @@ -133,6 +133,7 @@ static int __trace_define_field(struct list_head *head, const char *type,  	field->offset = offset;  	field->size = size;  	field->is_signed = is_signed; +	field->len = len;  	list_add(&field->link, head); @@ -150,14 +151,28 @@ int trace_define_field(struct trace_event_call *call, const char *type,  	head = trace_get_fields(call);  	return __trace_define_field(head, type, name, offset, size, -				    is_signed, filter_type); +				    is_signed, filter_type, 0);  }  EXPORT_SYMBOL_GPL(trace_define_field); +static int trace_define_field_ext(struct trace_event_call *call, const char *type, +		       const char *name, int offset, int size, int is_signed, +		       int filter_type, int len) +{ +	struct list_head *head; + +	if (WARN_ON(!call->class)) +		return 0; + +	head = trace_get_fields(call); +	return __trace_define_field(head, type, name, offset, size, +				    is_signed, filter_type, len); +} +  #define __generic_field(type, item, filter_type)			\  	ret = __trace_define_field(&ftrace_generic_fields, #type,	\  				   #item, 0, 0, is_signed_type(type),	\ -				   filter_type);			\ +				   filter_type, 0);			\  	if (ret)							\  		return ret; @@ -166,7 +181,7 @@ EXPORT_SYMBOL_GPL(trace_define_field);  				   "common_" #item,			\  				   offsetof(typeof(ent), item),		\  				   sizeof(ent.item),			\ -				   is_signed_type(type), FILTER_OTHER);	\ +				   is_signed_type(type), FILTER_OTHER, 0);	\  	if (ret)							\  		return ret; @@ -1588,12 +1603,17 @@ static int f_show(struct seq_file *m, void *v)  		seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d;\n",  			   field->type, field->name, field->offset,  			   field->size, !!field->is_signed); -	else -		seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned:%d;\n", +	else if (field->len) +		seq_printf(m, "\tfield:%.*s %s[%d];\toffset:%u;\tsize:%u;\tsigned:%d;\n",  			   (int)(array_descriptor - field->type),  			   field->type, field->name, -			   array_descriptor, field->offset, +			   field->len, field->offset,  			   field->size, !!field->is_signed); +	else +		seq_printf(m, "\tfield:%.*s %s[];\toffset:%u;\tsize:%u;\tsigned:%d;\n", +				(int)(array_descriptor - field->type), +				field->type, field->name, +				field->offset, field->size, !!field->is_signed);  	return 0;  } @@ -2261,8 +2281,6 @@ create_new_subsystem(const char *name)  	if (!system->name)  		goto out_free; -	system->filter = NULL; -  	system->filter = kzalloc(sizeof(struct event_filter), GFP_KERNEL);  	if (!system->filter)  		goto out_free; @@ -2379,9 +2397,10 @@ event_define_fields(struct trace_event_call *call)  			}  			offset = ALIGN(offset, field->align); -			ret = trace_define_field(call, field->type, field->name, +			ret = trace_define_field_ext(call, field->type, field->name,  						 offset, field->size, -						 field->is_signed, field->filter_type); +						 field->is_signed, field->filter_type, +						 field->len);  			if (WARN_ON_ONCE(ret)) {  				pr_err("error code is %d\n", ret);  				break; @@ -2822,7 +2841,7 @@ static __init int setup_trace_triggers(char *str)  		if (!trigger)  			break;  		bootup_triggers[i].event = strsep(&trigger, "."); -		bootup_triggers[i].trigger = strsep(&trigger, "."); +		bootup_triggers[i].trigger = trigger;  		if (!bootup_triggers[i].trigger)  			break;  	} @@ -3750,10 +3769,9 @@ static __init int event_trace_memsetup(void)  	return 0;  } -static __init void -early_enable_events(struct trace_array *tr, bool disable_first) +__init void +early_enable_events(struct trace_array *tr, char *buf, bool disable_first)  { -	char *buf = bootup_event_buf;  	char *token;  	int ret; @@ -3806,7 +3824,7 @@ static __init int event_trace_enable(void)  	 */  	__trace_early_add_events(tr); -	early_enable_events(tr, false); +	early_enable_events(tr, bootup_event_buf, false);  	trace_printk_start_comm(); @@ -3834,7 +3852,7 @@ static __init int event_trace_enable_again(void)  	if (!tr)  		return -ENODEV; -	early_enable_events(tr, true); +	early_enable_events(tr, bootup_event_buf, true);  	return 0;  }  | 
