]> Gentwo Git Trees - linux/.git/commitdiff
tools/rtla: Fix --on-threshold always triggering
authorTomas Glozar <tglozar@redhat.com>
Tue, 7 Oct 2025 09:53:39 +0000 (11:53 +0200)
committerTomas Glozar <tglozar@redhat.com>
Thu, 20 Nov 2025 12:15:55 +0000 (13:15 +0100)
Commit 8d933d5c89e8 ("rtla/timerlat: Add continue action") moved the
code performing on-threshold actions (enabled through --on-threshold
option) to inside the RTLA main loop.

The condition in the loop does not check whether the threshold was
actually exceeded or if stop tracing was requested by the user through
SIGINT or duration. This leads to a bug where on-threshold actions are
always performed, even when the threshold was not hit.

(BPF mode is not affected, since it uses a different condition in the
while loop.)

Add a condition that checks for !stop_tracing before executing the
actions. Also, fix incorrect brackets in hist_main_loop to match the
semantics of top_main_loop.

Fixes: 8d933d5c89e8 ("rtla/timerlat: Add continue action")
Fixes: 2f3172f9dd58 ("tools/rtla: Consolidate code between osnoise/timerlat and hist/top")
Reviewed-by: Crystal Wood <crwood@redhat.com>
Reviewed-by: Wander Lairson Costa <wander@redhat.com>
Link: https://lore.kernel.org/r/20251007095341.186923-1-tglozar@redhat.com
Signed-off-by: Tomas Glozar <tglozar@redhat.com>
tools/tracing/rtla/src/common.c

index 2e6e3dac1897f1ac857874cbcf6d65a2da4ec81f..b197037fc58b37554c59fbfbfbfbb31d105cd727 100644 (file)
@@ -268,6 +268,10 @@ int top_main_loop(struct osnoise_tool *tool)
                        tool->ops->print_stats(tool);
 
                if (osnoise_trace_is_off(tool, record)) {
+                       if (stop_tracing)
+                               /* stop tracing requested, do not perform actions */
+                               return 0;
+
                        actions_perform(&params->threshold_actions);
 
                        if (!params->threshold_actions.continue_flag)
@@ -315,20 +319,22 @@ int hist_main_loop(struct osnoise_tool *tool)
                }
 
                if (osnoise_trace_is_off(tool, tool->record)) {
+                       if (stop_tracing)
+                               /* stop tracing requested, do not perform actions */
+                               break;
+
                        actions_perform(&params->threshold_actions);
 
-                       if (!params->threshold_actions.continue_flag) {
+                       if (!params->threshold_actions.continue_flag)
                                /* continue flag not set, break */
                                break;
 
-                               /* continue action reached, re-enable tracing */
-                               if (tool->record)
-                                       trace_instance_start(&tool->record->trace);
-                               if (tool->aa)
-                                       trace_instance_start(&tool->aa->trace);
-                               trace_instance_start(&tool->trace);
-                       }
-                       break;
+                       /* continue action reached, re-enable tracing */
+                       if (tool->record)
+                               trace_instance_start(&tool->record->trace);
+                       if (tool->aa)
+                               trace_instance_start(&tool->aa->trace);
+                       trace_instance_start(&tool->trace);
                }
 
                /* is there still any user-threads ? */