diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 45 | 
1 files changed, 17 insertions, 28 deletions
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index b20d3ec75de9..874f2893cff0 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -129,7 +129,7 @@ static int tracing_set_tracer(const char *buf);  static char bootup_tracer_buf[MAX_TRACER_SIZE] __initdata;  static char *default_bootup_tracer; -static int __init set_ftrace(char *str) +static int __init set_cmdline_ftrace(char *str)  {  	strncpy(bootup_tracer_buf, str, MAX_TRACER_SIZE);  	default_bootup_tracer = bootup_tracer_buf; @@ -137,7 +137,7 @@ static int __init set_ftrace(char *str)  	ring_buffer_expanded = 1;  	return 1;  } -__setup("ftrace=", set_ftrace); +__setup("ftrace=", set_cmdline_ftrace);  static int __init set_ftrace_dump_on_oops(char *str)  { @@ -1361,10 +1361,11 @@ int trace_array_vprintk(struct trace_array *tr,  	pause_graph_tracing();  	raw_local_irq_save(irq_flags);  	__raw_spin_lock(&trace_buf_lock); -	len = vsnprintf(trace_buf, TRACE_BUF_SIZE, fmt, args); - -	len = min(len, TRACE_BUF_SIZE-1); -	trace_buf[len] = 0; +	if (args == NULL) { +		strncpy(trace_buf, fmt, TRACE_BUF_SIZE); +		len = strlen(trace_buf); +	} else +		len = vsnprintf(trace_buf, TRACE_BUF_SIZE, fmt, args);  	size = sizeof(*entry) + len + 1;  	buffer = tr->buffer; @@ -1373,10 +1374,10 @@ int trace_array_vprintk(struct trace_array *tr,  	if (!event)  		goto out_unlock;  	entry = ring_buffer_event_data(event); -	entry->ip			= ip; +	entry->ip = ip;  	memcpy(&entry->buf, trace_buf, len); -	entry->buf[len] = 0; +	entry->buf[len] = '\0';  	if (!filter_check_discard(call, entry, buffer, event))  		ring_buffer_unlock_commit(buffer, event); @@ -3319,22 +3320,11 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,  	return cnt;  } -static int mark_printk(const char *fmt, ...) -{ -	int ret; -	va_list args; -	va_start(args, fmt); -	ret = trace_vprintk(0, fmt, args); -	va_end(args); -	return ret; -} -  static ssize_t  tracing_mark_write(struct file *filp, const char __user *ubuf,  					size_t cnt, loff_t *fpos)  {  	char *buf; -	char *end;  	if (tracing_disabled)  		return -EINVAL; @@ -3342,7 +3332,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,  	if (cnt > TRACE_BUF_SIZE)  		cnt = TRACE_BUF_SIZE; -	buf = kmalloc(cnt + 1, GFP_KERNEL); +	buf = kmalloc(cnt + 2, GFP_KERNEL);  	if (buf == NULL)  		return -ENOMEM; @@ -3350,14 +3340,13 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,  		kfree(buf);  		return -EFAULT;  	} +	if (buf[cnt-1] != '\n') { +		buf[cnt] = '\n'; +		buf[cnt+1] = '\0'; +	} else +		buf[cnt] = '\0'; -	/* Cut from the first nil or newline. */ -	buf[cnt] = '\0'; -	end = strchr(buf, '\n'); -	if (end) -		*end = '\0'; - -	cnt = mark_printk("%s\n", buf); +	cnt = trace_vprintk(0, buf, NULL);  	kfree(buf);  	*fpos += cnt; @@ -3730,7 +3719,7 @@ tracing_stats_read(struct file *filp, char __user *ubuf,  	s = kmalloc(sizeof(*s), GFP_KERNEL);  	if (!s) -		return ENOMEM; +		return -ENOMEM;  	trace_seq_init(s); |