projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tracing: Have dynamic events have a ref counter
[linux-2.6-microblaze.git]
/
kernel
/
trace
/
trace_events.c
diff --git
a/kernel/trace/trace_events.c
b/kernel/trace/trace_events.c
index
80e9698
..
1349b6d
100644
(file)
--- a/
kernel/trace/trace_events.c
+++ b/
kernel/trace/trace_events.c
@@
-2525,7
+2525,10
@@
__register_event(struct trace_event_call *call, struct module *mod)
return ret;
list_add(&call->list, &ftrace_events);
return ret;
list_add(&call->list, &ftrace_events);
- call->mod = mod;
+ if (call->flags & TRACE_EVENT_FL_DYNAMIC)
+ atomic_set(&call->refcnt, 0);
+ else
+ call->module = mod;
return 0;
}
return 0;
}
@@
-2839,7
+2842,9
@@
static void trace_module_remove_events(struct module *mod)
down_write(&trace_event_sem);
list_for_each_entry_safe(call, p, &ftrace_events, list) {
down_write(&trace_event_sem);
list_for_each_entry_safe(call, p, &ftrace_events, list) {
- if (call->mod == mod)
+ if ((call->flags & TRACE_EVENT_FL_DYNAMIC) || !call->module)
+ continue;
+ if (call->module == mod)
__trace_remove_event_call(call);
}
up_write(&trace_event_sem);
__trace_remove_event_call(call);
}
up_write(&trace_event_sem);
@@
-2982,7
+2987,7
@@
struct trace_event_file *trace_get_event_file(const char *instance,
}
/* Don't let event modules unload while in use */
}
/* Don't let event modules unload while in use */
- ret = tr
y_module_get(file->event_call->mod
);
+ ret = tr
ace_event_try_get_ref(file->event_call
);
if (!ret) {
trace_array_put(tr);
ret = -EBUSY;
if (!ret) {
trace_array_put(tr);
ret = -EBUSY;
@@
-3012,7
+3017,7
@@
EXPORT_SYMBOL_GPL(trace_get_event_file);
void trace_put_event_file(struct trace_event_file *file)
{
mutex_lock(&event_mutex);
void trace_put_event_file(struct trace_event_file *file)
{
mutex_lock(&event_mutex);
-
module_put(file->event_call->mod
);
+
trace_event_put_ref(file->event_call
);
mutex_unlock(&event_mutex);
trace_array_put(file->tr);
mutex_unlock(&event_mutex);
trace_array_put(file->tr);
@@
-3147,7
+3152,7
@@
static int free_probe_data(void *data)
if (!edata->ref) {
/* Remove the SOFT_MODE flag */
__ftrace_event_enable_disable(edata->file, 0, 1);
if (!edata->ref) {
/* Remove the SOFT_MODE flag */
__ftrace_event_enable_disable(edata->file, 0, 1);
-
module_put(edata->file->event_call->mod
);
+
trace_event_put_ref(edata->file->event_call
);
kfree(edata);
}
return 0;
kfree(edata);
}
return 0;
@@
-3280,7
+3285,7
@@
event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
out_reg:
/* Don't let event modules unload while probe registered */
out_reg:
/* Don't let event modules unload while probe registered */
- ret = tr
y_module_get(file->event_call->mod
);
+ ret = tr
ace_event_try_get_ref(file->event_call
);
if (!ret) {
ret = -EBUSY;
goto out_free;
if (!ret) {
ret = -EBUSY;
goto out_free;
@@
-3310,7
+3315,7
@@
event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
out_disable:
__ftrace_event_enable_disable(file, 0, 1);
out_put:
out_disable:
__ftrace_event_enable_disable(file, 0, 1);
out_put:
-
module_put(file->event_call->mod
);
+
trace_event_put_ref(file->event_call
);
out_free:
kfree(data);
goto out;
out_free:
kfree(data);
goto out;
@@
-3376,7
+3381,8
@@
void __trace_early_add_events(struct trace_array *tr)
list_for_each_entry(call, &ftrace_events, list) {
/* Early boot up should not have any modules loaded */
list_for_each_entry(call, &ftrace_events, list) {
/* Early boot up should not have any modules loaded */
- if (WARN_ON_ONCE(call->mod))
+ if (!(call->flags & TRACE_EVENT_FL_DYNAMIC) &&
+ WARN_ON_ONCE(call->module))
continue;
ret = __trace_early_add_new_event(call, tr);
continue;
ret = __trace_early_add_new_event(call, tr);