583 lines · 14.7 KB · C
RawDownload
 	/* Checks for tracefs lockdown */	return ftrace_regex_open(ops, FTRACE_ITER_FILTER,				 inode, file);} static const struct file_operations stack_trace_filter_fops = {	.open = stack_trace_filter_open,	.read = seq_read,	.write = ftrace_filter_write,	.llseek = tracing_lseek,	.release = ftrace_regex_release,}; #endif /* CONFIG_DYNAMIC_FTRACE */ intstack_trace_sysctl(struct ctl_table *table, int write, void *buffer,		   size_t *lenp, loff_t *ppos){	int was_enabled;	int ret; 	mutex_lock(&stack_sysctl_mutex);	was_enabled = !!stack_tracer_enabled; 	ret = proc_dointvec(table, write, buffer, lenp, ppos); 	if (ret || !write || (was_enabled == !!stack_tracer_enabled))		goto out; 	if (stack_tracer_enabled)		register_ftrace_function(&trace_ops);	else		unregister_ftrace_function(&trace_ops); out:	mutex_unlock(&stack_sysctl_mutex);	return ret;} static char stack_trace_filter_buf[COMMAND_LINE_SIZE+1] __initdata; static __init int enable_stacktrace(char *str){	int len; 	if ((len = str_has_prefix(str, "_filter=")))		strncpy(stack_trace_filter_buf, str + len, COMMAND_LINE_SIZE); 	stack_tracer_enabled = 1;	return 1;}__setup("stacktrace", enable_stacktrace); static __init int stack_trace_init(void){	struct dentry *d_tracer; 	d_tracer = tracing_init_dentry();	if (IS_ERR(d_tracer))		return 0; 	trace_create_file("stack_max_size", 0644, d_tracer,			&stack_trace_max_size, &stack_max_size_fops); 	trace_create_file("stack_trace", 0444, d_tracer,			NULL, &stack_trace_fops); #ifdef CONFIG_DYNAMIC_FTRACE	trace_create_file("stack_trace_filter", 0644, d_tracer,			  &trace_ops, &stack_trace_filter_fops);#endif 	if (stack_trace_filter_buf[0])		ftrace_set_early_filter(&trace_ops, stack_trace_filter_buf, 1); 	if (stack_tracer_enabled)		register_ftrace_function(&trace_ops); 	return 0;} device_initcall(stack_trace_init);

Lines 501–583 of 583. Previous lines