mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	tracing: Add trace_options kernel command line parameter
Add trace_options to the kernel command line parameter to be able to set options at early boot. For example, to enable stack dumps of events, add the following: trace_options=stacktrace This along with the trace_event option, you can get not only traces of the events but also the stack dumps with them. Requested-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									0d5c6e1c19
								
							
						
					
					
						commit
						7bcfaf54f5
					
				
					 2 changed files with 55 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -2859,6 +2859,22 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 | 
			
		|||
			to facilitate early boot debugging.
 | 
			
		||||
			See also Documentation/trace/events.txt
 | 
			
		||||
 | 
			
		||||
	trace_options=[option-list]
 | 
			
		||||
			[FTRACE] Enable or disable tracer options at boot.
 | 
			
		||||
			The option-list is a comma delimited list of options
 | 
			
		||||
			that can be enabled or disabled just as if you were
 | 
			
		||||
			to echo the option name into
 | 
			
		||||
 | 
			
		||||
			    /sys/kernel/debug/tracing/trace_options
 | 
			
		||||
 | 
			
		||||
			For example, to enable stacktrace option (to dump the
 | 
			
		||||
			stack trace of each event), add to the command line:
 | 
			
		||||
 | 
			
		||||
			      trace_options=stacktrace
 | 
			
		||||
 | 
			
		||||
			See also Documentation/trace/ftrace.txt "trace options"
 | 
			
		||||
			section.
 | 
			
		||||
 | 
			
		||||
	transparent_hugepage=
 | 
			
		||||
			[KNL]
 | 
			
		||||
			Format: [always|madvise|never]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,6 +155,18 @@ static int __init set_ftrace_dump_on_oops(char *str)
 | 
			
		|||
}
 | 
			
		||||
__setup("ftrace_dump_on_oops", set_ftrace_dump_on_oops);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static char trace_boot_options_buf[MAX_TRACER_SIZE] __initdata;
 | 
			
		||||
static char *trace_boot_options __initdata;
 | 
			
		||||
 | 
			
		||||
static int __init set_trace_boot_options(char *str)
 | 
			
		||||
{
 | 
			
		||||
	strncpy(trace_boot_options_buf, str, MAX_TRACER_SIZE);
 | 
			
		||||
	trace_boot_options = trace_boot_options_buf;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
__setup("trace_options=", set_trace_boot_options);
 | 
			
		||||
 | 
			
		||||
unsigned long long ns2usecs(cycle_t nsec)
 | 
			
		||||
{
 | 
			
		||||
	nsec += 500;
 | 
			
		||||
| 
						 | 
				
			
			@ -2838,24 +2850,14 @@ static void set_tracer_flags(unsigned int mask, int enabled)
 | 
			
		|||
		trace_printk_start_stop_comm(enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ssize_t
 | 
			
		||||
tracing_trace_options_write(struct file *filp, const char __user *ubuf,
 | 
			
		||||
			size_t cnt, loff_t *ppos)
 | 
			
		||||
static int trace_set_options(char *option)
 | 
			
		||||
{
 | 
			
		||||
	char buf[64];
 | 
			
		||||
	char *cmp;
 | 
			
		||||
	int neg = 0;
 | 
			
		||||
	int ret;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	if (cnt >= sizeof(buf))
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (copy_from_user(&buf, ubuf, cnt))
 | 
			
		||||
		return -EFAULT;
 | 
			
		||||
 | 
			
		||||
	buf[cnt] = 0;
 | 
			
		||||
	cmp = strstrip(buf);
 | 
			
		||||
	cmp = strstrip(option);
 | 
			
		||||
 | 
			
		||||
	if (strncmp(cmp, "no", 2) == 0) {
 | 
			
		||||
		neg = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -2874,10 +2876,25 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,
 | 
			
		|||
		mutex_lock(&trace_types_lock);
 | 
			
		||||
		ret = set_tracer_option(current_trace, cmp, neg);
 | 
			
		||||
		mutex_unlock(&trace_types_lock);
 | 
			
		||||
		if (ret)
 | 
			
		||||
			return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ssize_t
 | 
			
		||||
tracing_trace_options_write(struct file *filp, const char __user *ubuf,
 | 
			
		||||
			size_t cnt, loff_t *ppos)
 | 
			
		||||
{
 | 
			
		||||
	char buf[64];
 | 
			
		||||
 | 
			
		||||
	if (cnt >= sizeof(buf))
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (copy_from_user(&buf, ubuf, cnt))
 | 
			
		||||
		return -EFAULT;
 | 
			
		||||
 | 
			
		||||
	trace_set_options(buf);
 | 
			
		||||
 | 
			
		||||
	*ppos += cnt;
 | 
			
		||||
 | 
			
		||||
	return cnt;
 | 
			
		||||
| 
						 | 
				
			
			@ -5133,6 +5150,13 @@ __init static int tracer_alloc_buffers(void)
 | 
			
		|||
 | 
			
		||||
	register_die_notifier(&trace_die_notifier);
 | 
			
		||||
 | 
			
		||||
	while (trace_boot_options) {
 | 
			
		||||
		char *option;
 | 
			
		||||
 | 
			
		||||
		option = strsep(&trace_boot_options, ",");
 | 
			
		||||
		trace_set_options(option);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
out_free_cpumask:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue