|
@@ -170,6 +170,26 @@ int ftrace_event_reg(struct ftrace_event_call *call, enum trace_reg type)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ftrace_event_reg);
|
|
|
|
|
|
+void trace_event_enable_cmd_record(bool enable)
|
|
|
+{
|
|
|
+ struct ftrace_event_call *call;
|
|
|
+
|
|
|
+ mutex_lock(&event_mutex);
|
|
|
+ list_for_each_entry(call, &ftrace_events, list) {
|
|
|
+ if (!(call->flags & TRACE_EVENT_FL_ENABLED))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (enable) {
|
|
|
+ tracing_start_cmdline_record();
|
|
|
+ call->flags |= TRACE_EVENT_FL_RECORDED_CMD;
|
|
|
+ } else {
|
|
|
+ tracing_stop_cmdline_record();
|
|
|
+ call->flags &= ~TRACE_EVENT_FL_RECORDED_CMD;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mutex_unlock(&event_mutex);
|
|
|
+}
|
|
|
+
|
|
|
static int ftrace_event_enable_disable(struct ftrace_event_call *call,
|
|
|
int enable)
|
|
|
{
|
|
@@ -179,13 +199,19 @@ static int ftrace_event_enable_disable(struct ftrace_event_call *call,
|
|
|
case 0:
|
|
|
if (call->flags & TRACE_EVENT_FL_ENABLED) {
|
|
|
call->flags &= ~TRACE_EVENT_FL_ENABLED;
|
|
|
- tracing_stop_cmdline_record();
|
|
|
+ if (call->flags & TRACE_EVENT_FL_RECORDED_CMD) {
|
|
|
+ tracing_stop_cmdline_record();
|
|
|
+ call->flags &= ~TRACE_EVENT_FL_RECORDED_CMD;
|
|
|
+ }
|
|
|
call->class->reg(call, TRACE_REG_UNREGISTER);
|
|
|
}
|
|
|
break;
|
|
|
case 1:
|
|
|
if (!(call->flags & TRACE_EVENT_FL_ENABLED)) {
|
|
|
- tracing_start_cmdline_record();
|
|
|
+ if (trace_flags & TRACE_ITER_RECORD_CMD) {
|
|
|
+ tracing_start_cmdline_record();
|
|
|
+ call->flags |= TRACE_EVENT_FL_RECORDED_CMD;
|
|
|
+ }
|
|
|
ret = call->class->reg(call, TRACE_REG_REGISTER);
|
|
|
if (ret) {
|
|
|
tracing_stop_cmdline_record();
|