tracing: Do not disable tracing when reading the trace file
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Tue, 17 Mar 2020 21:32:31 +0000 (17:32 -0400)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 27 Mar 2020 20:39:01 +0000 (16:39 -0400)
When opening the "trace" file, it is no longer necessary to disable tracing.

Note, a new option is created called "pause-on-trace", when set, will cause
the trace file to emulate its original behavior.

Link: http://lkml.kernel.org/r/20200317213416.903351225@goodmis.org
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Documentation/trace/ftrace.rst
kernel/trace/trace.c
kernel/trace/trace.h

index 99a0890..c33950a 100644 (file)
@@ -1125,6 +1125,12 @@ Here are the available options:
        the trace displays additional information about the
        latency, as described in "Latency trace format".
 
+  pause-on-trace
+       When set, opening the trace file for read, will pause
+       writing to the ring buffer (as if tracing_on was set to zero).
+       This simulates the original behavior of the trace file.
+       When the file is closed, tracing will be enabled again.
+
   record-cmd
        When any event or tracer is enabled, a hook is enabled
        in the sched_switch trace point to fill comm cache
index 4788912..650fa81 100644 (file)
@@ -4273,8 +4273,11 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
        if (trace_clocks[tr->clock_id].in_ns)
                iter->iter_flags |= TRACE_FILE_TIME_IN_NS;
 
-       /* stop the trace while dumping if we are not opening "snapshot" */
-       if (!iter->snapshot)
+       /*
+        * If pause-on-trace is enabled, then stop the trace while
+        * dumping, unless this is the "snapshot" file
+        */
+       if (!iter->snapshot && (tr->trace_flags & TRACE_ITER_PAUSE_ON_TRACE))
                tracing_stop_tr(tr);
 
        if (iter->cpu_file == RING_BUFFER_ALL_CPUS) {
@@ -4371,7 +4374,7 @@ static int tracing_release(struct inode *inode, struct file *file)
        if (iter->trace && iter->trace->close)
                iter->trace->close(iter);
 
-       if (!iter->snapshot)
+       if (!iter->snapshot && tr->stop_count)
                /* reenable tracing if it was previously enabled */
                tracing_start_tr(tr);
 
index c61e1b1..f37e051 100644 (file)
@@ -1302,6 +1302,7 @@ extern int trace_get_user(struct trace_parser *parser, const char __user *ubuf,
                C(IRQ_INFO,             "irq-info"),            \
                C(MARKERS,              "markers"),             \
                C(EVENT_FORK,           "event-fork"),          \
+               C(PAUSE_ON_TRACE,       "pause-on-trace"),      \
                FUNCTION_FLAGS                                  \
                FGRAPH_FLAGS                                    \
                STACK_FLAGS                                     \