Skip to content

Commit a695cb5

Browse files
Steven Rostedt (Red Hat)rostedt
authored andcommitted
tracing: Prevent deleting instances when they are being read
Add a ref count to the trace_array structure and prevent removal of instances that have open descriptors. Signed-off-by: Steven Rostedt <[email protected]>
1 parent 121aaee commit a695cb5

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

kernel/trace/trace.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2613,6 +2613,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
26132613
tracing_iter_reset(iter, cpu);
26142614
}
26152615

2616+
tr->ref++;
2617+
26162618
mutex_unlock(&trace_types_lock);
26172619

26182620
return iter;
@@ -2649,6 +2651,10 @@ static int tracing_release(struct inode *inode, struct file *file)
26492651
tr = iter->tr;
26502652

26512653
mutex_lock(&trace_types_lock);
2654+
2655+
WARN_ON(!tr->ref);
2656+
tr->ref--;
2657+
26522658
for_each_tracing_cpu(cpu) {
26532659
if (iter->buffer_iter[cpu])
26542660
ring_buffer_read_finish(iter->buffer_iter[cpu]);
@@ -4460,6 +4466,10 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
44604466
if (!info)
44614467
return -ENOMEM;
44624468

4469+
mutex_lock(&trace_types_lock);
4470+
4471+
tr->ref++;
4472+
44634473
info->iter.tr = tr;
44644474
info->iter.cpu_file = tc->cpu;
44654475
info->iter.trace = tr->current_trace;
@@ -4470,6 +4480,8 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
44704480

44714481
filp->private_data = info;
44724482

4483+
mutex_unlock(&trace_types_lock);
4484+
44734485
return nonseekable_open(inode, filp);
44744486
}
44754487

@@ -4568,10 +4580,17 @@ static int tracing_buffers_release(struct inode *inode, struct file *file)
45684580
struct ftrace_buffer_info *info = file->private_data;
45694581
struct trace_iterator *iter = &info->iter;
45704582

4583+
mutex_lock(&trace_types_lock);
4584+
4585+
WARN_ON(!iter->tr->ref);
4586+
iter->tr->ref--;
4587+
45714588
if (info->spare)
45724589
ring_buffer_free_read_page(iter->trace_buffer->buffer, info->spare);
45734590
kfree(info);
45744591

4592+
mutex_unlock(&trace_types_lock);
4593+
45754594
return 0;
45764595
}
45774596

@@ -5411,6 +5430,10 @@ static int instance_delete(const char *name)
54115430
if (!found)
54125431
goto out_unlock;
54135432

5433+
ret = -EBUSY;
5434+
if (tr->ref)
5435+
goto out_unlock;
5436+
54145437
list_del(&tr->list);
54155438

54165439
event_trace_del_tracer(tr);

kernel/trace/trace.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ struct trace_array {
219219
struct list_head systems;
220220
struct list_head events;
221221
struct task_struct *waiter;
222+
int ref;
222223
};
223224

224225
enum {

0 commit comments

Comments
 (0)