diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 46 | 
1 files changed, 31 insertions, 15 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index bcd93031d042..c9336e98ac59 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1751,12 +1751,13 @@ static inline void set_cmdline(int idx, const char *cmdline)  static int allocate_cmdlines_buffer(unsigned int val,  				    struct saved_cmdlines_buffer *s)  { -	s->map_cmdline_to_pid = kmalloc(val * sizeof(*s->map_cmdline_to_pid), -					GFP_KERNEL); +	s->map_cmdline_to_pid = kmalloc_array(val, +					      sizeof(*s->map_cmdline_to_pid), +					      GFP_KERNEL);  	if (!s->map_cmdline_to_pid)  		return -ENOMEM; -	s->saved_cmdlines = kmalloc(val * TASK_COMM_LEN, GFP_KERNEL); +	s->saved_cmdlines = kmalloc_array(TASK_COMM_LEN, val, GFP_KERNEL);  	if (!s->saved_cmdlines) {  		kfree(s->map_cmdline_to_pid);  		return -ENOMEM; @@ -4360,7 +4361,8 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)  	if (mask == TRACE_ITER_RECORD_TGID) {  		if (!tgid_map) -			tgid_map = kzalloc((PID_MAX_DEFAULT + 1) * sizeof(*tgid_map), +			tgid_map = kcalloc(PID_MAX_DEFAULT + 1, +					   sizeof(*tgid_map),  					   GFP_KERNEL);  		if (!tgid_map) {  			tr->trace_flags &= ~TRACE_ITER_RECORD_TGID; @@ -4395,8 +4397,7 @@ static int trace_set_options(struct trace_array *tr, char *option)  {  	char *cmp;  	int neg = 0; -	int ret = -ENODEV; -	int i; +	int ret;  	size_t orig_len = strlen(option);  	cmp = strstrip(option); @@ -4408,16 +4409,12 @@ static int trace_set_options(struct trace_array *tr, char *option)  	mutex_lock(&trace_types_lock); -	for (i = 0; trace_options[i]; i++) { -		if (strcmp(cmp, trace_options[i]) == 0) { -			ret = set_tracer_flag(tr, 1 << i, !neg); -			break; -		} -	} - +	ret = match_string(trace_options, -1, cmp);  	/* If no option could be set, test the specific tracer options */ -	if (!trace_options[i]) +	if (ret < 0)  		ret = set_tracer_option(tr, cmp, neg); +	else +		ret = set_tracer_flag(tr, 1 << ret, !neg);  	mutex_unlock(&trace_types_lock); @@ -5068,7 +5065,7 @@ trace_insert_eval_map_file(struct module *mod, struct trace_eval_map **start,  	 * where the head holds the module and length of array, and the  	 * tail holds a pointer to the next list.  	 */ -	map_array = kmalloc(sizeof(*map_array) * (len + 2), GFP_KERNEL); +	map_array = kmalloc_array(len + 2, sizeof(*map_array), GFP_KERNEL);  	if (!map_array) {  		pr_warn("Unable to allocate trace eval mapping\n");  		return; @@ -6074,6 +6071,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,  {  	struct trace_array *tr = filp->private_data;  	struct ring_buffer_event *event; +	enum event_trigger_type tt = ETT_NONE;  	struct ring_buffer *buffer;  	struct print_entry *entry;  	unsigned long irq_flags; @@ -6122,6 +6120,12 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,  		written = cnt;  	len = cnt; +	if (tr->trace_marker_file && !list_empty(&tr->trace_marker_file->triggers)) { +		/* do not add \n before testing triggers, but add \0 */ +		entry->buf[cnt] = '\0'; +		tt = event_triggers_call(tr->trace_marker_file, entry, event); +	} +  	if (entry->buf[cnt - 1] != '\n') {  		entry->buf[cnt] = '\n';  		entry->buf[cnt + 1] = '\0'; @@ -6130,6 +6134,9 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,  	__buffer_unlock_commit(buffer, event); +	if (tt) +		event_triggers_post_call(tr->trace_marker_file, tt); +  	if (written > 0)  		*fpos += written; @@ -7896,6 +7903,7 @@ static __init void create_trace_instances(struct dentry *d_tracer)  static void  init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)  { +	struct trace_event_file *file;  	int cpu;  	trace_create_file("available_tracers", 0444, d_tracer, @@ -7928,6 +7936,12 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)  	trace_create_file("trace_marker", 0220, d_tracer,  			  tr, &tracing_mark_fops); +	file = __find_event_file(tr, "ftrace", "print"); +	if (file && file->dir) +		trace_create_file("trigger", 0644, file->dir, file, +				  &event_trigger_fops); +	tr->trace_marker_file = file; +  	trace_create_file("trace_marker_raw", 0220, d_tracer,  			  tr, &tracing_mark_raw_fops); @@ -8111,6 +8125,8 @@ static __init int tracer_init_tracefs(void)  	if (IS_ERR(d_tracer))  		return 0; +	event_trace_init(); +  	init_tracer_tracefs(&global_trace, d_tracer);  	ftrace_init_tracefs_toplevel(&global_trace, d_tracer);  | 
