diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 76 | 
1 files changed, 41 insertions, 35 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d9293402ee68..a2f0b9f33e9b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -74,11 +74,6 @@ static struct tracer_opt dummy_tracer_opt[] = {  	{ }  }; -static struct tracer_flags dummy_tracer_flags = { -	.val = 0, -	.opts = dummy_tracer_opt -}; -  static int  dummy_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)  { @@ -1258,12 +1253,22 @@ int __init register_tracer(struct tracer *type)  	if (!type->set_flag)  		type->set_flag = &dummy_set_flag; -	if (!type->flags) -		type->flags = &dummy_tracer_flags; -	else +	if (!type->flags) { +		/*allocate a dummy tracer_flags*/ +		type->flags = kmalloc(sizeof(*type->flags), GFP_KERNEL); +		if (!type->flags) { +			ret = -ENOMEM; +			goto out; +		} +		type->flags->val = 0; +		type->flags->opts = dummy_tracer_opt; +	} else  		if (!type->flags->opts)  			type->flags->opts = dummy_tracer_opt; +	/* store the tracer for __set_tracer_option */ +	type->flags->trace = type; +  	ret = run_tracer_selftest(type);  	if (ret < 0)  		goto out; @@ -1659,6 +1664,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags,  #else  		TRACE_FLAG_IRQS_NOSUPPORT |  #endif +		((pc & NMI_MASK    ) ? TRACE_FLAG_NMI     : 0) |  		((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |  		((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |  		(tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | @@ -2071,20 +2077,20 @@ void trace_printk_init_buffers(void)  	/* trace_printk() is for debug use only. Don't use it in production. */ -	pr_warning("\n"); -	pr_warning("**********************************************************\n"); -	pr_warning("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n"); -	pr_warning("**                                                      **\n"); -	pr_warning("** trace_printk() being used. Allocating extra memory.  **\n"); -	pr_warning("**                                                      **\n"); -	pr_warning("** This means that this is a DEBUG kernel and it is     **\n"); -	pr_warning("** unsafe for production use.                           **\n"); -	pr_warning("**                                                      **\n"); -	pr_warning("** If you see this message and you are not debugging    **\n"); -	pr_warning("** the kernel, report this immediately to your vendor!  **\n"); -	pr_warning("**                                                      **\n"); -	pr_warning("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n"); -	pr_warning("**********************************************************\n"); +	pr_warn("\n"); +	pr_warn("**********************************************************\n"); +	pr_warn("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n"); +	pr_warn("**                                                      **\n"); +	pr_warn("** trace_printk() being used. Allocating extra memory.  **\n"); +	pr_warn("**                                                      **\n"); +	pr_warn("** This means that this is a DEBUG kernel and it is     **\n"); +	pr_warn("** unsafe for production use.                           **\n"); +	pr_warn("**                                                      **\n"); +	pr_warn("** If you see this message and you are not debugging    **\n"); +	pr_warn("** the kernel, report this immediately to your vendor!  **\n"); +	pr_warn("**                                                      **\n"); +	pr_warn("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n"); +	pr_warn("**********************************************************\n");  	/* Expand the buffers to set size */  	tracing_update_buffers(); @@ -3505,7 +3511,7 @@ static int __set_tracer_option(struct trace_array *tr,  			       struct tracer_flags *tracer_flags,  			       struct tracer_opt *opts, int neg)  { -	struct tracer *trace = tr->current_trace; +	struct tracer *trace = tracer_flags->trace;  	int ret;  	ret = trace->set_flag(tr, tracer_flags->val, opts->bit, !neg); @@ -4101,7 +4107,7 @@ trace_insert_enum_map_file(struct module *mod, struct trace_enum_map **start,  	 */  	map_array = kmalloc(sizeof(*map_array) * (len + 2), GFP_KERNEL);  	if (!map_array) { -		pr_warning("Unable to allocate trace enum mapping\n"); +		pr_warn("Unable to allocate trace enum mapping\n");  		return;  	} @@ -4949,7 +4955,10 @@ static ssize_t tracing_splice_read_pipe(struct file *filp,  	spd.nr_pages = i; -	ret = splice_to_pipe(pipe, &spd); +	if (i) +		ret = splice_to_pipe(pipe, &spd); +	else +		ret = 0;  out:  	splice_shrink_spd(&spd);  	return ret; @@ -6131,7 +6140,7 @@ tracing_init_tracefs_percpu(struct trace_array *tr, long cpu)  	snprintf(cpu_dir, 30, "cpu%ld", cpu);  	d_cpu = tracefs_create_dir(cpu_dir, d_percpu);  	if (!d_cpu) { -		pr_warning("Could not create tracefs '%s' entry\n", cpu_dir); +		pr_warn("Could not create tracefs '%s' entry\n", cpu_dir);  		return;  	} @@ -6318,7 +6327,7 @@ struct dentry *trace_create_file(const char *name,  	ret = tracefs_create_file(name, mode, parent, data, fops);  	if (!ret) -		pr_warning("Could not create tracefs '%s' entry\n", name); +		pr_warn("Could not create tracefs '%s' entry\n", name);  	return ret;  } @@ -6337,7 +6346,7 @@ static struct dentry *trace_options_init_dentry(struct trace_array *tr)  	tr->options = tracefs_create_dir("options", d_tracer);  	if (!tr->options) { -		pr_warning("Could not create tracefs directory 'options'\n"); +		pr_warn("Could not create tracefs directory 'options'\n");  		return NULL;  	} @@ -6391,11 +6400,8 @@ create_trace_option_files(struct trace_array *tr, struct tracer *tracer)  		return;  	for (i = 0; i < tr->nr_topts; i++) { -		/* -		 * Check if these flags have already been added. -		 * Some tracers share flags. -		 */ -		if (tr->topts[i].tracer->flags == tracer->flags) +		/* Make sure there's no duplicate flags. */ +		if (WARN_ON_ONCE(tr->topts[i].tracer->flags == tracer->flags))  			return;  	} @@ -7248,8 +7254,8 @@ __init static int tracer_alloc_buffers(void)  	if (trace_boot_clock) {  		ret = tracing_set_clock(&global_trace, trace_boot_clock);  		if (ret < 0) -			pr_warning("Trace clock %s not defined, going back to default\n", -				   trace_boot_clock); +			pr_warn("Trace clock %s not defined, going back to default\n", +				trace_boot_clock);  	}  	/*  | 
