ring-buffer: Do not poll non allocated cpu buffers
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Thu, 23 May 2013 18:21:36 +0000 (14:21 -0400)
committerSteven Rostedt <rostedt@rostedt.homelinux.com>
Tue, 28 May 2013 14:53:20 +0000 (10:53 -0400)
The tracing infrastructure sets up for possible CPUs, but it uses
the ring buffer polling, it is possible to call the ring buffer
polling code with a CPU that hasn't been allocated. This will cause
a kernel oops when it access a ring buffer cpu buffer that is part
of the possible cpus but hasn't been allocated yet as the CPU has never
been online.

Reported-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Tested-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ring_buffer.c

index b59aea2..e444ff8 100644 (file)
@@ -620,6 +620,9 @@ int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu,
        if (cpu == RING_BUFFER_ALL_CPUS)
                work = &buffer->irq_work;
        else {
+               if (!cpumask_test_cpu(cpu, buffer->cpumask))
+                       return -EINVAL;
+
                cpu_buffer = buffer->buffers[cpu];
                work = &cpu_buffer->irq_work;
        }