Revert "tracing: Have trace_event_file have ref counters"

This reverts commit 2fa74d29fc which is
commit bb32500fb9b78215e4ef6ee8b4345c5f5d7eafb4 upstream.

It breaks the current Android ABI, and if needed, can be brought back in
an abi-safe way in the future.

Bug: 161946584
Change-Id: If981a67442122352b1836c6e75ba2a462cbc731d
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2023-12-11 12:26:13 +00:00
parent fd71493204
commit 88487f809a
5 changed files with 15 additions and 53 deletions

View file

@ -478,7 +478,6 @@ enum {
EVENT_FILE_FL_TRIGGER_COND_BIT, EVENT_FILE_FL_TRIGGER_COND_BIT,
EVENT_FILE_FL_PID_FILTER_BIT, EVENT_FILE_FL_PID_FILTER_BIT,
EVENT_FILE_FL_WAS_ENABLED_BIT, EVENT_FILE_FL_WAS_ENABLED_BIT,
EVENT_FILE_FL_FREED_BIT,
}; };
extern struct trace_event_file *trace_get_event_file(const char *instance, extern struct trace_event_file *trace_get_event_file(const char *instance,
@ -617,7 +616,6 @@ extern int __kprobe_event_add_fields(struct dynevent_cmd *cmd, ...);
* TRIGGER_COND - When set, one or more triggers has an associated filter * TRIGGER_COND - When set, one or more triggers has an associated filter
* PID_FILTER - When set, the event is filtered based on pid * PID_FILTER - When set, the event is filtered based on pid
* WAS_ENABLED - Set when enabled to know to clear trace on module removal * WAS_ENABLED - Set when enabled to know to clear trace on module removal
* FREED - File descriptor is freed, all fields should be considered invalid
*/ */
enum { enum {
EVENT_FILE_FL_ENABLED = (1 << EVENT_FILE_FL_ENABLED_BIT), EVENT_FILE_FL_ENABLED = (1 << EVENT_FILE_FL_ENABLED_BIT),
@ -631,7 +629,6 @@ enum {
EVENT_FILE_FL_TRIGGER_COND = (1 << EVENT_FILE_FL_TRIGGER_COND_BIT), EVENT_FILE_FL_TRIGGER_COND = (1 << EVENT_FILE_FL_TRIGGER_COND_BIT),
EVENT_FILE_FL_PID_FILTER = (1 << EVENT_FILE_FL_PID_FILTER_BIT), EVENT_FILE_FL_PID_FILTER = (1 << EVENT_FILE_FL_PID_FILTER_BIT),
EVENT_FILE_FL_WAS_ENABLED = (1 << EVENT_FILE_FL_WAS_ENABLED_BIT), EVENT_FILE_FL_WAS_ENABLED = (1 << EVENT_FILE_FL_WAS_ENABLED_BIT),
EVENT_FILE_FL_FREED = (1 << EVENT_FILE_FL_FREED_BIT),
}; };
struct trace_event_file { struct trace_event_file {
@ -660,7 +657,6 @@ struct trace_event_file {
* caching and such. Which is mostly OK ;-) * caching and such. Which is mostly OK ;-)
*/ */
unsigned long flags; unsigned long flags;
atomic_t ref; /* ref count for opened files */
atomic_t sm_ref; /* soft-mode reference counter */ atomic_t sm_ref; /* soft-mode reference counter */
atomic_t tm_ref; /* trigger-mode reference counter */ atomic_t tm_ref; /* trigger-mode reference counter */
}; };

View file

@ -4913,20 +4913,6 @@ int tracing_open_file_tr(struct inode *inode, struct file *filp)
if (ret) if (ret)
return ret; return ret;
mutex_lock(&event_mutex);
/* Fail if the file is marked for removal */
if (file->flags & EVENT_FILE_FL_FREED) {
trace_array_put(file->tr);
ret = -ENODEV;
} else {
event_file_get(file);
}
mutex_unlock(&event_mutex);
if (ret)
return ret;
filp->private_data = inode->i_private; filp->private_data = inode->i_private;
return 0; return 0;
@ -4937,7 +4923,6 @@ int tracing_release_file_tr(struct inode *inode, struct file *filp)
struct trace_event_file *file = inode->i_private; struct trace_event_file *file = inode->i_private;
trace_array_put(file->tr); trace_array_put(file->tr);
event_file_put(file);
return 0; return 0;
} }

View file

@ -1629,9 +1629,6 @@ extern void event_trigger_unregister(struct event_command *cmd_ops,
char *glob, char *glob,
struct event_trigger_data *trigger_data); struct event_trigger_data *trigger_data);
extern void event_file_get(struct trace_event_file *file);
extern void event_file_put(struct trace_event_file *file);
/** /**
* struct event_trigger_ops - callbacks for trace event triggers * struct event_trigger_ops - callbacks for trace event triggers
* *

View file

@ -988,38 +988,26 @@ static void remove_subsystem(struct trace_subsystem_dir *dir)
} }
} }
void event_file_get(struct trace_event_file *file)
{
atomic_inc(&file->ref);
}
void event_file_put(struct trace_event_file *file)
{
if (WARN_ON_ONCE(!atomic_read(&file->ref))) {
if (file->flags & EVENT_FILE_FL_FREED)
kmem_cache_free(file_cachep, file);
return;
}
if (atomic_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;
kmem_cache_free(file_cachep, file);
}
}
static void remove_event_file_dir(struct trace_event_file *file) static void remove_event_file_dir(struct trace_event_file *file)
{ {
struct dentry *dir = file->dir; struct dentry *dir = file->dir;
struct dentry *child;
tracefs_remove(dir); if (dir) {
spin_lock(&dir->d_lock); /* probably unneeded */
list_for_each_entry(child, &dir->d_subdirs, d_child) {
if (d_really_is_positive(child)) /* probably unneeded */
d_inode(child)->i_private = NULL;
}
spin_unlock(&dir->d_lock);
tracefs_remove(dir);
}
list_del(&file->list); list_del(&file->list);
remove_subsystem(file->system); remove_subsystem(file->system);
free_event_filter(file->filter); free_event_filter(file->filter);
file->flags |= EVENT_FILE_FL_FREED; kmem_cache_free(file_cachep, file);
event_file_put(file);
} }
/* /*
@ -1392,7 +1380,7 @@ event_enable_read(struct file *filp, char __user *ubuf, size_t cnt,
flags = file->flags; flags = file->flags;
mutex_unlock(&event_mutex); mutex_unlock(&event_mutex);
if (!file || flags & EVENT_FILE_FL_FREED) if (!file)
return -ENODEV; return -ENODEV;
if (flags & EVENT_FILE_FL_ENABLED && if (flags & EVENT_FILE_FL_ENABLED &&
@ -1430,7 +1418,7 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
ret = -ENODEV; ret = -ENODEV;
mutex_lock(&event_mutex); mutex_lock(&event_mutex);
file = event_file_data(filp); file = event_file_data(filp);
if (likely(file && !(file->flags & EVENT_FILE_FL_FREED))) if (likely(file))
ret = ftrace_event_enable_disable(file, val); ret = ftrace_event_enable_disable(file, val);
mutex_unlock(&event_mutex); mutex_unlock(&event_mutex);
break; break;
@ -1704,7 +1692,7 @@ event_filter_read(struct file *filp, char __user *ubuf, size_t cnt,
mutex_lock(&event_mutex); mutex_lock(&event_mutex);
file = event_file_data(filp); file = event_file_data(filp);
if (file && !(file->flags & EVENT_FILE_FL_FREED)) if (file)
print_event_filter(file, s); print_event_filter(file, s);
mutex_unlock(&event_mutex); mutex_unlock(&event_mutex);
@ -2822,7 +2810,6 @@ trace_create_new_event(struct trace_event_call *call,
atomic_set(&file->tm_ref, 0); atomic_set(&file->tm_ref, 0);
INIT_LIST_HEAD(&file->triggers); INIT_LIST_HEAD(&file->triggers);
list_add(&file->list, &tr->events); list_add(&file->list, &tr->events);
event_file_get(file);
return file; return file;
} }

View file

@ -1997,9 +1997,6 @@ int apply_event_filter(struct trace_event_file *file, char *filter_string)
struct event_filter *filter = NULL; struct event_filter *filter = NULL;
int err; int err;
if (file->flags & EVENT_FILE_FL_FREED)
return -ENODEV;
if (!strcmp(strstrip(filter_string), "0")) { if (!strcmp(strstrip(filter_string), "0")) {
filter_disable(file); filter_disable(file);
filter = event_filter(file); filter = event_filter(file);