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

Commit a695cb58 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Steven Rostedt
Browse files

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: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 121aaee7
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -2613,6 +2613,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
		tracing_iter_reset(iter, cpu);
	}

	tr->ref++;

	mutex_unlock(&trace_types_lock);

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

	mutex_lock(&trace_types_lock);

	WARN_ON(!tr->ref);
	tr->ref--;

	for_each_tracing_cpu(cpu) {
		if (iter->buffer_iter[cpu])
			ring_buffer_read_finish(iter->buffer_iter[cpu]);
@@ -4460,6 +4466,10 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
	if (!info)
		return -ENOMEM;

	mutex_lock(&trace_types_lock);

	tr->ref++;

	info->iter.tr		= tr;
	info->iter.cpu_file	= tc->cpu;
	info->iter.trace	= tr->current_trace;
@@ -4470,6 +4480,8 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)

	filp->private_data = info;

	mutex_unlock(&trace_types_lock);

	return nonseekable_open(inode, filp);
}

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

	mutex_lock(&trace_types_lock);

	WARN_ON(!iter->tr->ref);
	iter->tr->ref--;

	if (info->spare)
		ring_buffer_free_read_page(iter->trace_buffer->buffer, info->spare);
	kfree(info);

	mutex_unlock(&trace_types_lock);

	return 0;
}

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

	ret = -EBUSY;
	if (tr->ref)
		goto out_unlock;

	list_del(&tr->list);

	event_trace_del_tracer(tr);
+1 −0
Original line number Diff line number Diff line
@@ -219,6 +219,7 @@ struct trace_array {
	struct list_head	systems;
	struct list_head	events;
	struct task_struct	*waiter;
	int			ref;
};

enum {