diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index c8b5e9781d01..422f4ca656cf 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -478,7 +478,6 @@ enum { EVENT_FILE_FL_TRIGGER_COND_BIT, EVENT_FILE_FL_PID_FILTER_BIT, EVENT_FILE_FL_WAS_ENABLED_BIT, - EVENT_FILE_FL_FREED_BIT, }; 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 * PID_FILTER - When set, the event is filtered based on pid * 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 { 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_PID_FILTER = (1 << EVENT_FILE_FL_PID_FILTER_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 { @@ -660,7 +657,6 @@ struct trace_event_file { * caching and such. Which is mostly OK ;-) */ unsigned long flags; - atomic_t ref; /* ref count for opened files */ atomic_t sm_ref; /* soft-mode reference counter */ atomic_t tm_ref; /* trigger-mode reference counter */ }; diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 24f9f0bf94f4..cb48819eaff6 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -4913,20 +4913,6 @@ int tracing_open_file_tr(struct inode *inode, struct file *filp) if (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; 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; trace_array_put(file->tr); - event_file_put(file); return 0; } diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 5da42889f2eb..4902b8970d4f 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1629,9 +1629,6 @@ extern void event_trigger_unregister(struct event_command *cmd_ops, char *glob, 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 * diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index a6d2f99f847d..2e3dce5e2575 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -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) { 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); remove_subsystem(file->system); free_event_filter(file->filter); - file->flags |= EVENT_FILE_FL_FREED; - event_file_put(file); + kmem_cache_free(file_cachep, file); } /* @@ -1392,7 +1380,7 @@ event_enable_read(struct file *filp, char __user *ubuf, size_t cnt, flags = file->flags; mutex_unlock(&event_mutex); - if (!file || flags & EVENT_FILE_FL_FREED) + if (!file) return -ENODEV; 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; mutex_lock(&event_mutex); file = event_file_data(filp); - if (likely(file && !(file->flags & EVENT_FILE_FL_FREED))) + if (likely(file)) ret = ftrace_event_enable_disable(file, val); mutex_unlock(&event_mutex); break; @@ -1704,7 +1692,7 @@ event_filter_read(struct file *filp, char __user *ubuf, size_t cnt, mutex_lock(&event_mutex); file = event_file_data(filp); - if (file && !(file->flags & EVENT_FILE_FL_FREED)) + if (file) print_event_filter(file, s); mutex_unlock(&event_mutex); @@ -2822,7 +2810,6 @@ 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); return file; } diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 86a0531efd43..96acc2b71ac7 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -1997,9 +1997,6 @@ int apply_event_filter(struct trace_event_file *file, char *filter_string) struct event_filter *filter = NULL; int err; - if (file->flags & EVENT_FILE_FL_FREED) - return -ENODEV; - if (!strcmp(strstrip(filter_string), "0")) { filter_disable(file); filter = event_filter(file);