Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf5e6519 authored by Steven Rostedt's avatar Steven Rostedt
Browse files

ftrace: disable tracing on resize

Impact: fix for bug on resize

This patch addresses the bug found here:

 http://bugzilla.kernel.org/show_bug.cgi?id=11996



When ftrace converted to the new unified trace buffer, the resizing of
the buffer was not protected as much as it was originally. If tracing
is performed while the resize occurs, then the buffer can be corrupted.

This patch disables all ftrace buffer modifications before a resize
takes place.

Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
parent 3ad4f597
Loading
Loading
Loading
Loading
+16 −1
Original line number Original line Diff line number Diff line
@@ -2676,7 +2676,7 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
{
{
	unsigned long val;
	unsigned long val;
	char buf[64];
	char buf[64];
	int ret;
	int ret, cpu;
	struct trace_array *tr = filp->private_data;
	struct trace_array *tr = filp->private_data;


	if (cnt >= sizeof(buf))
	if (cnt >= sizeof(buf))
@@ -2704,6 +2704,14 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
		goto out;
		goto out;
	}
	}


	/* disable all cpu buffers */
	for_each_tracing_cpu(cpu) {
		if (global_trace.data[cpu])
			atomic_inc(&global_trace.data[cpu]->disabled);
		if (max_tr.data[cpu])
			atomic_inc(&max_tr.data[cpu]->disabled);
	}

	if (val != global_trace.entries) {
	if (val != global_trace.entries) {
		ret = ring_buffer_resize(global_trace.buffer, val);
		ret = ring_buffer_resize(global_trace.buffer, val);
		if (ret < 0) {
		if (ret < 0) {
@@ -2735,6 +2743,13 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
	if (tracing_disabled)
	if (tracing_disabled)
		cnt = -ENOMEM;
		cnt = -ENOMEM;
 out:
 out:
	for_each_tracing_cpu(cpu) {
		if (global_trace.data[cpu])
			atomic_dec(&global_trace.data[cpu]->disabled);
		if (max_tr.data[cpu])
			atomic_dec(&max_tr.data[cpu]->disabled);
	}

	max_tr.entries = global_trace.entries;
	max_tr.entries = global_trace.entries;
	mutex_unlock(&trace_types_lock);
	mutex_unlock(&trace_types_lock);