|
@@ -426,6 +426,8 @@ struct ring_buffer {
|
|
atomic_t record_disabled;
|
|
atomic_t record_disabled;
|
|
cpumask_var_t cpumask;
|
|
cpumask_var_t cpumask;
|
|
|
|
|
|
|
|
+ struct lock_class_key *reader_lock_key;
|
|
|
|
+
|
|
struct mutex mutex;
|
|
struct mutex mutex;
|
|
|
|
|
|
struct ring_buffer_per_cpu **buffers;
|
|
struct ring_buffer_per_cpu **buffers;
|
|
@@ -565,6 +567,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
|
|
cpu_buffer->cpu = cpu;
|
|
cpu_buffer->cpu = cpu;
|
|
cpu_buffer->buffer = buffer;
|
|
cpu_buffer->buffer = buffer;
|
|
spin_lock_init(&cpu_buffer->reader_lock);
|
|
spin_lock_init(&cpu_buffer->reader_lock);
|
|
|
|
+ lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key);
|
|
cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
|
|
cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
|
|
INIT_LIST_HEAD(&cpu_buffer->pages);
|
|
INIT_LIST_HEAD(&cpu_buffer->pages);
|
|
|
|
|
|
@@ -635,7 +638,8 @@ static int rb_cpu_notify(struct notifier_block *self,
|
|
* when the buffer wraps. If this flag is not set, the buffer will
|
|
* when the buffer wraps. If this flag is not set, the buffer will
|
|
* drop data when the tail hits the head.
|
|
* drop data when the tail hits the head.
|
|
*/
|
|
*/
|
|
-struct ring_buffer *ring_buffer_alloc(unsigned long size, unsigned flags)
|
|
|
|
|
|
+struct ring_buffer *__ring_buffer_alloc(unsigned long size, unsigned flags,
|
|
|
|
+ struct lock_class_key *key)
|
|
{
|
|
{
|
|
struct ring_buffer *buffer;
|
|
struct ring_buffer *buffer;
|
|
int bsize;
|
|
int bsize;
|
|
@@ -658,6 +662,7 @@ struct ring_buffer *ring_buffer_alloc(unsigned long size, unsigned flags)
|
|
buffer->pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
|
|
buffer->pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
|
|
buffer->flags = flags;
|
|
buffer->flags = flags;
|
|
buffer->clock = trace_clock_local;
|
|
buffer->clock = trace_clock_local;
|
|
|
|
+ buffer->reader_lock_key = key;
|
|
|
|
|
|
/* need at least two pages */
|
|
/* need at least two pages */
|
|
if (buffer->pages == 1)
|
|
if (buffer->pages == 1)
|
|
@@ -715,7 +720,7 @@ struct ring_buffer *ring_buffer_alloc(unsigned long size, unsigned flags)
|
|
kfree(buffer);
|
|
kfree(buffer);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(ring_buffer_alloc);
|
|
|
|
|
|
+EXPORT_SYMBOL_GPL(__ring_buffer_alloc);
|
|
|
|
|
|
/**
|
|
/**
|
|
* ring_buffer_free - free a ring buffer.
|
|
* ring_buffer_free - free a ring buffer.
|