rtla: Check for trace off also in the trace instance
authorDaniel Bristot de Oliveira <bristot@kernel.org>
Wed, 2 Mar 2022 19:01:37 +0000 (20:01 +0100)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Tue, 15 Mar 2022 18:36:50 +0000 (14:36 -0400)
With the addition of --trigger option, it is also possible to stop
the trace from the -t tracing instance using the traceoff trigger.

Make rtla tools to check if the trace is stopped also in the trace
instance, stopping the execution of the tool.

Link: https://lkml.kernel.org/r/59fc7c6f23dddd5c8b7ef1782cf3da51ea2ce0f5.1646247211.git.bristot@kernel.org
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: Clark Williams <williams@redhat.com>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
tools/tracing/rtla/src/osnoise_hist.c
tools/tracing/rtla/src/osnoise_top.c
tools/tracing/rtla/src/timerlat_hist.c
tools/tracing/rtla/src/timerlat_top.c
tools/tracing/rtla/src/trace.c
tools/tracing/rtla/src/trace.h

index f86b5fb94efdcba9250ff898cadc44b29597e77f..b73b919bd6b42abd12e9572eec0a73fe66425685 100644 (file)
@@ -848,7 +848,7 @@ int osnoise_hist_main(int argc, char *argv[])
                        goto out_hist;
                }
 
-               if (!tracefs_trace_is_on(trace->inst))
+               if (trace_is_off(&tool->trace, &record->trace))
                        break;
        };
 
@@ -858,7 +858,7 @@ int osnoise_hist_main(int argc, char *argv[])
 
        return_value = 0;
 
-       if (!tracefs_trace_is_on(trace->inst)) {
+       if (trace_is_off(&tool->trace, &record->trace)) {
                printf("rtla timelat hit stop tracing\n");
                if (params->trace_output) {
                        printf("  Saving trace to %s\n", params->trace_output);
index c3d75ee456a53b0388cfa3e0c167a3f64ca47489..fd29a4049322f930311b1b857a9289b006c0db9b 100644 (file)
@@ -629,7 +629,7 @@ int osnoise_top_main(int argc, char **argv)
                if (!params->quiet)
                        osnoise_print_stats(params, tool);
 
-               if (!tracefs_trace_is_on(trace->inst))
+               if (trace_is_off(&tool->trace, &record->trace))
                        break;
 
        } while (!stop_tracing);
@@ -638,7 +638,7 @@ int osnoise_top_main(int argc, char **argv)
 
        return_value = 0;
 
-       if (!tracefs_trace_is_on(trace->inst)) {
+       if (trace_is_off(&tool->trace, &record->trace)) {
                printf("osnoise hit stop tracing\n");
                if (params->trace_output) {
                        printf("  Saving trace to %s\n", params->trace_output);
index 8341f38fd0b1494e7b3e7fe9812a7dbfdc894e5d..17188ccb6e8b2e891e580241101b7ceadb516712 100644 (file)
@@ -861,7 +861,7 @@ int timerlat_hist_main(int argc, char *argv[])
                        goto out_hist;
                }
 
-               if (!tracefs_trace_is_on(trace->inst))
+               if (trace_is_off(&tool->trace, &record->trace))
                        break;
        };
 
@@ -869,7 +869,7 @@ int timerlat_hist_main(int argc, char *argv[])
 
        return_value = 0;
 
-       if (!tracefs_trace_is_on(trace->inst)) {
+       if (trace_is_off(&tool->trace, &record->trace)) {
                printf("rtla timelat hit stop tracing\n");
                if (params->trace_output) {
                        printf("  Saving trace to %s\n", params->trace_output);
index 9ce5a09664bc878f5abe04c56e6b57212fd289a0..bf2a50350e61c1ca91e54e2a534f81253d8f0d71 100644 (file)
@@ -655,7 +655,7 @@ int timerlat_top_main(int argc, char *argv[])
                if (!params->quiet)
                        timerlat_print_stats(params, top);
 
-               if (!tracefs_trace_is_on(trace->inst))
+               if (trace_is_off(&top->trace, &record->trace))
                        break;
 
        };
@@ -664,7 +664,7 @@ int timerlat_top_main(int argc, char *argv[])
 
        return_value = 0;
 
-       if (!tracefs_trace_is_on(trace->inst)) {
+       if (trace_is_off(&top->trace, &record->trace)) {
                printf("rtla timelat hit stop tracing\n");
                if (params->trace_output) {
                        printf("  Saving trace to %s\n", params->trace_output);
index 8249ec4d77ccc0a259daa82f9736a56fbfd98bfb..5784c9f9e5706581ed2bd1ef620ffd46574696fd 100644 (file)
@@ -516,3 +516,22 @@ void trace_events_destroy(struct trace_instance *instance,
        trace_events_disable(instance, events);
        trace_events_free(events);
 }
+
+int trace_is_off(struct trace_instance *tool, struct trace_instance *trace)
+{
+       /*
+        * The tool instance is always present, it is the one used to collect
+        * data.
+        */
+       if (!tracefs_trace_is_on(tool->inst))
+               return 1;
+
+       /*
+        * The trace instance is only enabled when -t is set. IOW, when the system
+        * is tracing.
+        */
+       if (trace && !tracefs_trace_is_on(trace->inst))
+               return 1;
+
+       return 0;
+}
index 51ad344c600bf4670382ba256bb33316894999c0..2e9a89a256150b2eb8e3d114968e356a9efe62b2 100644 (file)
@@ -47,3 +47,4 @@ int trace_events_enable(struct trace_instance *instance,
 
 int trace_event_add_filter(struct trace_events *event, char *filter);
 int trace_event_add_trigger(struct trace_events *event, char *trigger);
+int trace_is_off(struct trace_instance *tool, struct trace_instance *trace);