diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 65 | 
1 files changed, 41 insertions, 24 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index bcd93031d042..87cf25171fb8 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1360,8 +1360,6 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  void  update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  { -	struct ring_buffer *buf; -  	if (tr->stop_count)  		return; @@ -1375,9 +1373,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  	arch_spin_lock(&tr->max_lock); -	buf = tr->trace_buffer.buffer; -	tr->trace_buffer.buffer = tr->max_buffer.buffer; -	tr->max_buffer.buffer = buf; +	swap(tr->trace_buffer.buffer, tr->max_buffer.buffer);  	__update_max_tr(tr, tsk, cpu);  	arch_spin_unlock(&tr->max_lock); @@ -1751,12 +1747,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; @@ -2956,6 +2953,7 @@ out_nobuffer:  }  EXPORT_SYMBOL_GPL(trace_vbprintk); +__printf(3, 0)  static int  __trace_array_vprintk(struct ring_buffer *buffer,  		      unsigned long ip, const char *fmt, va_list args) @@ -3010,12 +3008,14 @@ out_nobuffer:  	return len;  } +__printf(3, 0)  int trace_array_vprintk(struct trace_array *tr,  			unsigned long ip, const char *fmt, va_list args)  {  	return __trace_array_vprintk(tr->trace_buffer.buffer, ip, fmt, args);  } +__printf(3, 0)  int trace_array_printk(struct trace_array *tr,  		       unsigned long ip, const char *fmt, ...)  { @@ -3031,6 +3031,7 @@ int trace_array_printk(struct trace_array *tr,  	return ret;  } +__printf(3, 4)  int trace_array_printk_buf(struct ring_buffer *buffer,  			   unsigned long ip, const char *fmt, ...)  { @@ -3046,6 +3047,7 @@ int trace_array_printk_buf(struct ring_buffer *buffer,  	return ret;  } +__printf(2, 0)  int trace_vprintk(unsigned long ip, const char *fmt, va_list args)  {  	return trace_array_vprintk(&global_trace, ip, fmt, args); @@ -3363,8 +3365,8 @@ static void print_func_help_header(struct trace_buffer *buf, struct seq_file *m,  	print_event_info(buf, m); -	seq_printf(m, "#           TASK-PID   CPU#   %s  TIMESTAMP  FUNCTION\n", tgid ? "TGID     " : ""); -	seq_printf(m, "#              | |       |    %s     |         |\n",	 tgid ? "  |      " : ""); +	seq_printf(m, "#           TASK-PID   %s  CPU#   TIMESTAMP  FUNCTION\n", tgid ? "TGID     " : ""); +	seq_printf(m, "#              | |     %s    |       |         |\n",	 tgid ? "  |      " : "");  }  static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file *m, @@ -3384,9 +3386,9 @@ static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file  		   tgid ? tgid_space : space);  	seq_printf(m, "#                          %s||| /     delay\n",  		   tgid ? tgid_space : space); -	seq_printf(m, "#           TASK-PID   CPU#%s||||    TIMESTAMP  FUNCTION\n", +	seq_printf(m, "#           TASK-PID %sCPU#  ||||    TIMESTAMP  FUNCTION\n",  		   tgid ? "   TGID   " : space); -	seq_printf(m, "#              | |       | %s||||       |         |\n", +	seq_printf(m, "#              | |   %s  |   ||||       |         |\n",  		   tgid ? "     |    " : space);  } @@ -4360,7 +4362,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 +4398,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 +4410,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 +5066,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 +6072,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 +6121,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 +6135,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 +7904,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 +7937,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 +8126,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);  |