Commit 6e2fdcef authored by Steven Rostedt's avatar Steven Rostedt Committed by Steven Rostedt (Google)
Browse files

tracing: Use refcount for trace_event_file reference counter

Instead of using an atomic counter for the trace_event_file reference
counter, use the refcount interface. It has various checks to make sure
the reference counting is correct, and will warn if it detects an error
(like refcount_inc() on '0').

Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://lore.kernel.org/20240726144208.687cce24@rorschach.local.home


Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent b1560408
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -680,7 +680,7 @@ struct trace_event_file {
	 * caching and such. Which is mostly OK ;-)
	 */
	unsigned long		flags;
	atomic_t		ref;	/* ref count for opened files */
	refcount_t		ref;	/* ref count for opened files */
	atomic_t		sm_ref;	/* soft-mode reference counter */
	atomic_t		tm_ref;	/* trigger-mode reference counter */
};
+4 −4
Original line number Diff line number Diff line
@@ -992,18 +992,18 @@ static void remove_subsystem(struct trace_subsystem_dir *dir)

void event_file_get(struct trace_event_file *file)
{
	atomic_inc(&file->ref);
	refcount_inc(&file->ref);
}

void event_file_put(struct trace_event_file *file)
{
	if (WARN_ON_ONCE(!atomic_read(&file->ref))) {
	if (WARN_ON_ONCE(!refcount_read(&file->ref))) {
		if (file->flags & EVENT_FILE_FL_FREED)
			kmem_cache_free(file_cachep, file);
		return;
	}

	if (atomic_dec_and_test(&file->ref)) {
	if (refcount_dec_and_test(&file->ref)) {
		/* Count should only go to zero when it is freed */
		if (WARN_ON_ONCE(!(file->flags & EVENT_FILE_FL_FREED)))
			return;
@@ -3003,7 +3003,7 @@ trace_create_new_event(struct trace_event_call *call,
	atomic_set(&file->tm_ref, 0);
	INIT_LIST_HEAD(&file->triggers);
	list_add(&file->list, &tr->events);
	event_file_get(file);
	refcount_set(&file->ref, 1);

	return file;
}