|
@@ -409,11 +409,31 @@ static void put_system(struct ftrace_subsystem_dir *dir)
|
|
|
mutex_unlock(&event_mutex);
|
|
|
}
|
|
|
|
|
|
+static void remove_subsystem(struct ftrace_subsystem_dir *dir)
|
|
|
+{
|
|
|
+ if (!dir)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (!--dir->nr_events) {
|
|
|
+ debugfs_remove_recursive(dir->entry);
|
|
|
+ list_del(&dir->list);
|
|
|
+ __put_system_dir(dir);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void *event_file_data(struct file *filp)
|
|
|
{
|
|
|
return ACCESS_ONCE(file_inode(filp)->i_private);
|
|
|
}
|
|
|
|
|
|
+static void remove_event_file_dir(struct ftrace_event_file *file)
|
|
|
+{
|
|
|
+ list_del(&file->list);
|
|
|
+ debugfs_remove_recursive(file->dir);
|
|
|
+ remove_subsystem(file->system);
|
|
|
+ kmem_cache_free(file_cachep, file);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Open and update trace_array ref count.
|
|
|
* Must have the current trace_array passed to it.
|
|
@@ -1549,33 +1569,16 @@ event_create_dir(struct dentry *parent,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void remove_subsystem(struct ftrace_subsystem_dir *dir)
|
|
|
-{
|
|
|
- if (!dir)
|
|
|
- return;
|
|
|
-
|
|
|
- if (!--dir->nr_events) {
|
|
|
- debugfs_remove_recursive(dir->entry);
|
|
|
- list_del(&dir->list);
|
|
|
- __put_system_dir(dir);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static void remove_event_from_tracers(struct ftrace_event_call *call)
|
|
|
{
|
|
|
struct ftrace_event_file *file;
|
|
|
struct trace_array *tr;
|
|
|
|
|
|
do_for_each_event_file_safe(tr, file) {
|
|
|
-
|
|
|
if (file->event_call != call)
|
|
|
continue;
|
|
|
|
|
|
- list_del(&file->list);
|
|
|
- debugfs_remove_recursive(file->dir);
|
|
|
- remove_subsystem(file->system);
|
|
|
- kmem_cache_free(file_cachep, file);
|
|
|
-
|
|
|
+ remove_event_file_dir(file);
|
|
|
/*
|
|
|
* The do_for_each_event_file_safe() is
|
|
|
* a double loop. After finding the call for this
|
|
@@ -2305,12 +2308,8 @@ __trace_remove_event_dirs(struct trace_array *tr)
|
|
|
{
|
|
|
struct ftrace_event_file *file, *next;
|
|
|
|
|
|
- list_for_each_entry_safe(file, next, &tr->events, list) {
|
|
|
- list_del(&file->list);
|
|
|
- debugfs_remove_recursive(file->dir);
|
|
|
- remove_subsystem(file->system);
|
|
|
- kmem_cache_free(file_cachep, file);
|
|
|
- }
|
|
|
+ list_for_each_entry_safe(file, next, &tr->events, list)
|
|
|
+ remove_event_file_dir(file);
|
|
|
}
|
|
|
|
|
|
static void
|