Skip to content

Commit

Permalink
rtla/timerlat: Use pretty formatting only on interactive tty
Browse files Browse the repository at this point in the history
timerlat top does some background/font color formatting. While useful
on terminal, it breaks the output on other formats. For example, when
piping the output for pastebin tools, the format strings are printed
as characters. For instance:

  [2;37;40m                                     Timer Latency                                              [0;0;0m
    0 00:00:01   |          IRQ Timer Latency (us)        |         Thread Timer Latency (us)
  [2;30;47mCPU COUNT      |      cur       min       avg       max |      cur       min       avg       max[0;0;0m
    0 #1013      |        1         0         1        54 |        5         2         4        57
    1 #1013      |        3         0         1        10 |        6         2         4        15

To avoid this problem, do the formatting only if running on a tty,
and in !quiet mode.

Link: https://lkml.kernel.org/r/8288e1544ceab21557d5dda93a0f00339497c649.1713968967.git.bristot@kernel.org

Cc: Jonathan Corbet <[email protected]>
Cc: Juri Lelli <[email protected]>
Signed-off-by: Daniel Bristot de Oliveira <[email protected]>
  • Loading branch information
Daniel Bristot de Oliveira committed May 15, 2024
1 parent a40e5e4 commit f5c0cda
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions tools/tracing/rtla/src/timerlat_top.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ struct timerlat_top_params {
int hk_cpus;
int user_top;
int user_workload;
int pretty_output;
cpu_set_t hk_cpu_set;
struct sched_attr sched_param;
struct trace_events *events;
Expand Down Expand Up @@ -179,19 +180,22 @@ timerlat_top_handler(struct trace_seq *s, struct tep_record *record,
/*
* timerlat_top_header - print the header of the tool output
*/
static void timerlat_top_header(struct osnoise_tool *top)
static void timerlat_top_header(struct timerlat_top_params *params, struct osnoise_tool *top)
{
struct timerlat_top_params *params = top->params;
struct trace_seq *s = top->trace.seq;
char duration[26];

get_duration(top->start_time, duration, sizeof(duration));

trace_seq_printf(s, "\033[2;37;40m");
if (params->pretty_output)
trace_seq_printf(s, "\033[2;37;40m");

trace_seq_printf(s, " Timer Latency ");
if (params->user_top)
trace_seq_printf(s, " ");
trace_seq_printf(s, "\033[0;0;0m");

if (params->pretty_output)
trace_seq_printf(s, "\033[0;0;0m");
trace_seq_printf(s, "\n");

trace_seq_printf(s, "%-6s | IRQ Timer Latency (%s) | Thread Timer Latency (%s)", duration,
Expand All @@ -204,11 +208,15 @@ static void timerlat_top_header(struct osnoise_tool *top)
}

trace_seq_printf(s, "\n");
trace_seq_printf(s, "\033[2;30;47m");
if (params->pretty_output)
trace_seq_printf(s, "\033[2;30;47m");

trace_seq_printf(s, "CPU COUNT | cur min avg max | cur min avg max");
if (params->user_top)
trace_seq_printf(s, " | cur min avg max");
trace_seq_printf(s, "\033[0;0;0m");

if (params->pretty_output)
trace_seq_printf(s, "\033[0;0;0m");
trace_seq_printf(s, "\n");
}

Expand Down Expand Up @@ -305,7 +313,7 @@ timerlat_print_stats(struct timerlat_top_params *params, struct osnoise_tool *to
if (!params->quiet)
clear_terminal(trace->seq);

timerlat_top_header(top);
timerlat_top_header(params, top);

for (i = 0; i < nr_cpus; i++) {
if (params->cpus && !CPU_ISSET(i, &params->monitored_cpus))
Expand Down Expand Up @@ -693,6 +701,9 @@ timerlat_top_apply_config(struct osnoise_tool *top, struct timerlat_top_params *
}
}

if (isatty(1) && !params->quiet)
params->pretty_output = 1;

return 0;

out_err:
Expand Down

0 comments on commit f5c0cda

Please sign in to comment.