Message ID | 20250320092500.101385-3-tglozar@redhat.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 20d6b07581ce37338cc709b4381e8f314309b187 |
Headers | show |
Series | rtla: Always set all tracer options | expand |
On Thu, 20 Mar 2025, Tomas Glozar wrote: > The functions osnoise_top_apply_config and osnoise_hist_apply_config, as > well as timerlat_top_apply_config and timerlat_hist_apply_config, are > mostly the same. > > Move common part from them into separate functions osnoise_apply_config > and timerlat_apply_config. > > For rtla-timerlat, also unify params->user_hist and params->user_top > into one field called params->user_data, and move several fields used > only by timerlat-top into the top-only section of struct > timerlat_params. > > Signed-off-by: Tomas Glozar <tglozar@redhat.com> > --- > tools/tracing/rtla/src/osnoise.c | 79 ++++++++++++++++ > tools/tracing/rtla/src/osnoise.h | 1 + > tools/tracing/rtla/src/osnoise_hist.c | 66 +------------- > tools/tracing/rtla/src/osnoise_top.c | 66 +------------- > tools/tracing/rtla/src/timerlat.c | 109 ++++++++++++++++++++++ > tools/tracing/rtla/src/timerlat.h | 11 +-- > tools/tracing/rtla/src/timerlat_hist.c | 119 ++++--------------------- > tools/tracing/rtla/src/timerlat_top.c | 110 +++-------------------- > 8 files changed, 227 insertions(+), 334 deletions(-) > > diff --git a/tools/tracing/rtla/src/osnoise.c b/tools/tracing/rtla/src/osnoise.c > index 93d485c0e949..1735a36466c4 100644 > --- a/tools/tracing/rtla/src/osnoise.c > +++ b/tools/tracing/rtla/src/osnoise.c > @@ -3,6 +3,7 @@ > * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org> > */ > > +#define _GNU_SOURCE > #include <sys/types.h> > #include <sys/stat.h> > #include <pthread.h> > @@ -12,6 +13,7 @@ > #include <errno.h> > #include <fcntl.h> > #include <stdio.h> > +#include <sched.h> > > #include "osnoise.h" > > @@ -1114,6 +1116,83 @@ osnoise_report_missed_events(struct osnoise_tool *tool) > } > } > > +/* > + * osnoise_apply_config - apply common configs to the initialized tool > + */ > +int > +osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params) > +{ > + int retval; > + > + if (!params->sleep_time) > + params->sleep_time = 1; > + > + if (params->cpus) { > + retval = osnoise_set_cpus(tool->context, params->cpus); > + if (retval) { > + err_msg("Failed to apply CPUs config\n"); > + goto out_err; > + } > + } > + > + if (params->runtime || params->period) { > + retval = osnoise_set_runtime_period(tool->context, > + params->runtime, > + params->period); > + if (retval) { > + err_msg("Failed to set runtime and/or period\n"); > + goto out_err; > + } > + } > + > + if (params->stop_us) { > + retval = osnoise_set_stop_us(tool->context, params->stop_us); > + if (retval) { > + err_msg("Failed to set stop us\n"); > + goto out_err; > + } > + } > + > + if (params->stop_total_us) { > + retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); > + if (retval) { > + err_msg("Failed to set stop total us\n"); > + goto out_err; > + } > + } > + > + if (params->threshold) { > + retval = osnoise_set_tracing_thresh(tool->context, params->threshold); > + if (retval) { > + err_msg("Failed to set tracing_thresh\n"); > + goto out_err; > + } > + } > + > + if (params->hk_cpus) { > + retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), > + ¶ms->hk_cpu_set); > + if (retval == -1) { > + err_msg("Failed to set rtla to the house keeping CPUs\n"); > + goto out_err; > + } > + } else if (params->cpus) { > + /* > + * Even if the user do not set a house-keeping CPU, try to > + * move rtla to a CPU set different to the one where the user > + * set the workload to run. > + * > + * No need to check results as this is an automatic attempt. > + */ > + auto_house_keeping(¶ms->monitored_cpus); > + } > + > + return 0; > + > +out_err: > + return -1; > +} > + > static void osnoise_usage(int err) > { > int i; > diff --git a/tools/tracing/rtla/src/osnoise.h b/tools/tracing/rtla/src/osnoise.h > index f78ffbdc8c8d..ac1c99910744 100644 > --- a/tools/tracing/rtla/src/osnoise.h > +++ b/tools/tracing/rtla/src/osnoise.h > @@ -155,6 +155,7 @@ struct osnoise_tool *osnoise_init_tool(char *tool_name); > struct osnoise_tool *osnoise_init_trace_tool(char *tracer); > void osnoise_report_missed_events(struct osnoise_tool *tool); > bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record); > +int osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params); > > int osnoise_hist_main(int argc, char *argv[]); > int osnoise_top_main(int argc, char **argv); > diff --git a/tools/tracing/rtla/src/osnoise_hist.c b/tools/tracing/rtla/src/osnoise_hist.c > index 4721f15f77cd..d9d15c8f27c7 100644 > --- a/tools/tracing/rtla/src/osnoise_hist.c > +++ b/tools/tracing/rtla/src/osnoise_hist.c > @@ -12,7 +12,6 @@ > #include <errno.h> > #include <stdio.h> > #include <time.h> > -#include <sched.h> > > #include "osnoise.h" > > @@ -705,68 +704,9 @@ osnoise_hist_apply_config(struct osnoise_tool *tool, struct osnoise_params *para > { > int retval; > > - if (!params->sleep_time) > - params->sleep_time = 1; > - > - if (params->cpus) { > - retval = osnoise_set_cpus(tool->context, params->cpus); > - if (retval) { > - err_msg("Failed to apply CPUs config\n"); > - goto out_err; > - } > - } > - > - if (params->runtime || params->period) { > - retval = osnoise_set_runtime_period(tool->context, > - params->runtime, > - params->period); > - if (retval) { > - err_msg("Failed to set runtime and/or period\n"); > - goto out_err; > - } > - } > - > - if (params->stop_us) { > - retval = osnoise_set_stop_us(tool->context, params->stop_us); > - if (retval) { > - err_msg("Failed to set stop us\n"); > - goto out_err; > - } > - } > - > - if (params->stop_total_us) { > - retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); > - if (retval) { > - err_msg("Failed to set stop total us\n"); > - goto out_err; > - } > - } > - > - if (params->threshold) { > - retval = osnoise_set_tracing_thresh(tool->context, params->threshold); > - if (retval) { > - err_msg("Failed to set tracing_thresh\n"); > - goto out_err; > - } > - } > - > - if (params->hk_cpus) { > - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), > - ¶ms->hk_cpu_set); > - if (retval == -1) { > - err_msg("Failed to set rtla to the house keeping CPUs\n"); > - goto out_err; > - } > - } else if (params->cpus) { > - /* > - * Even if the user do not set a house-keeping CPU, try to > - * move rtla to a CPU set different to the one where the user > - * set the workload to run. > - * > - * No need to check results as this is an automatic attempt. > - */ > - auto_house_keeping(¶ms->monitored_cpus); > - } > + retval = osnoise_apply_config(tool, params); > + if (retval) > + goto out_err; > > return 0; > > diff --git a/tools/tracing/rtla/src/osnoise_top.c b/tools/tracing/rtla/src/osnoise_top.c > index 7f393019bbf5..3455ee73e2e6 100644 > --- a/tools/tracing/rtla/src/osnoise_top.c > +++ b/tools/tracing/rtla/src/osnoise_top.c > @@ -11,7 +11,6 @@ > #include <unistd.h> > #include <stdio.h> > #include <time.h> > -#include <sched.h> > > #include "osnoise.h" > > @@ -523,50 +522,9 @@ osnoise_top_apply_config(struct osnoise_tool *tool, struct osnoise_params *param > { > int retval; > > - if (!params->sleep_time) > - params->sleep_time = 1; > - > - if (params->cpus) { > - retval = osnoise_set_cpus(tool->context, params->cpus); > - if (retval) { > - err_msg("Failed to apply CPUs config\n"); > - goto out_err; > - } > - } > - > - if (params->runtime || params->period) { > - retval = osnoise_set_runtime_period(tool->context, > - params->runtime, > - params->period); > - if (retval) { > - err_msg("Failed to set runtime and/or period\n"); > - goto out_err; > - } > - } > - > - if (params->stop_us) { > - retval = osnoise_set_stop_us(tool->context, params->stop_us); > - if (retval) { > - err_msg("Failed to set stop us\n"); > - goto out_err; > - } > - } > - > - if (params->stop_total_us) { > - retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); > - if (retval) { > - err_msg("Failed to set stop total us\n"); > - goto out_err; > - } > - } > - > - if (params->threshold) { > - retval = osnoise_set_tracing_thresh(tool->context, params->threshold); > - if (retval) { > - err_msg("Failed to set tracing_thresh\n"); > - goto out_err; > - } > - } > + retval = osnoise_apply_config(tool, params); > + if (retval) > + goto out_err; > > if (params->mode == MODE_HWNOISE) { > retval = osnoise_set_irq_disable(tool->context, 1); > @@ -576,24 +534,6 @@ osnoise_top_apply_config(struct osnoise_tool *tool, struct osnoise_params *param > } > } > > - if (params->hk_cpus) { > - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), > - ¶ms->hk_cpu_set); > - if (retval == -1) { > - err_msg("Failed to set rtla to the house keeping CPUs\n"); > - goto out_err; > - } > - } else if (params->cpus) { > - /* > - * Even if the user do not set a house-keeping CPU, try to > - * move rtla to a CPU set different to the one where the user > - * set the workload to run. > - * > - * No need to check results as this is an automatic attempt. > - */ > - auto_house_keeping(¶ms->monitored_cpus); > - } > - > if (isatty(STDOUT_FILENO) && !params->quiet) > params->pretty_output = 1; > > diff --git a/tools/tracing/rtla/src/timerlat.c b/tools/tracing/rtla/src/timerlat.c > index 21cdcc5c4a29..448fb1f7d3a6 100644 > --- a/tools/tracing/rtla/src/timerlat.c > +++ b/tools/tracing/rtla/src/timerlat.c > @@ -2,6 +2,7 @@ > /* > * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org> > */ > +#define _GNU_SOURCE > #include <sys/types.h> > #include <sys/stat.h> > #include <pthread.h> > @@ -11,9 +12,117 @@ > #include <errno.h> > #include <fcntl.h> > #include <stdio.h> > +#include <sched.h> > > #include "timerlat.h" > > +/* > + * timerlat_apply_config - apply common configs to the initialized tool > + */ > +int > +timerlat_apply_config(struct osnoise_tool *tool, struct timerlat_params *params) > +{ > + int retval, i; > + > + if (!params->sleep_time) > + params->sleep_time = 1; > + > + if (params->cpus) { > + retval = osnoise_set_cpus(tool->context, params->cpus); > + if (retval) { > + err_msg("Failed to apply CPUs config\n"); > + goto out_err; > + } > + } else { > + for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++) > + CPU_SET(i, ¶ms->monitored_cpus); > + } > + > + if (params->stop_us) { > + retval = osnoise_set_stop_us(tool->context, params->stop_us); > + if (retval) { > + err_msg("Failed to set stop us\n"); > + goto out_err; > + } > + } > + > + if (params->stop_total_us) { > + retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); > + if (retval) { > + err_msg("Failed to set stop total us\n"); > + goto out_err; > + } > + } > + > + > + if (params->timerlat_period_us) { > + retval = osnoise_set_timerlat_period_us(tool->context, params->timerlat_period_us); > + if (retval) { > + err_msg("Failed to set timerlat period\n"); > + goto out_err; > + } > + } > + > + > + if (params->print_stack) { > + retval = osnoise_set_print_stack(tool->context, params->print_stack); > + if (retval) { > + err_msg("Failed to set print stack\n"); > + goto out_err; > + } > + } > + > + if (params->hk_cpus) { > + retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), > + ¶ms->hk_cpu_set); > + if (retval == -1) { > + err_msg("Failed to set rtla to the house keeping CPUs\n"); > + goto out_err; > + } > + } else if (params->cpus) { > + /* > + * Even if the user do not set a house-keeping CPU, try to > + * move rtla to a CPU set different to the one where the user > + * set the workload to run. > + * > + * No need to check results as this is an automatic attempt. > + */ > + auto_house_keeping(¶ms->monitored_cpus); > + } > + > + /* > + * If the user did not specify a type of thread, try user-threads first. > + * Fall back to kernel threads otherwise. > + */ > + if (!params->kernel_workload && !params->user_data) { > + retval = tracefs_file_exists(NULL, "osnoise/per_cpu/cpu0/timerlat_fd"); > + if (retval) { > + debug_msg("User-space interface detected, setting user-threads\n"); > + params->user_workload = 1; > + params->user_data = 1; > + } else { > + debug_msg("User-space interface not detected, setting kernel-threads\n"); > + params->kernel_workload = 1; > + } > + } > + > + /* > + * Set workload according to type of thread if the kernel supports it. > + * On kernels without support, user threads will have already failed > + * on missing timerlat_fd, and kernel threads do not need it. > + */ > + retval = osnoise_set_workload(tool->context, params->kernel_workload); > + if (retval < -1) { > + err_msg("Failed to set OSNOISE_WORKLOAD option\n"); > + goto out_err; > + } > + > + return 0; > + > +out_err: > + return -1; > +} > + > static void timerlat_usage(int err) > { > int i; > diff --git a/tools/tracing/rtla/src/timerlat.h b/tools/tracing/rtla/src/timerlat.h > index cadc613dc82e..73045aef23fa 100644 > --- a/tools/tracing/rtla/src/timerlat.h > +++ b/tools/tracing/rtla/src/timerlat.h > @@ -15,17 +15,15 @@ struct timerlat_params { > int sleep_time; > int output_divisor; > int duration; > - int quiet; > int set_sched; > int dma_latency; > int no_aa; > - int aa_only; > int dump_tasks; > int cgroup; > int hk_cpus; > int user_workload; > int kernel_workload; > - int pretty_output; > + int user_data; > int warmup; > int buffer_size; > int deepest_idle_state; > @@ -35,11 +33,12 @@ struct timerlat_params { > union { > struct { > /* top only */ > - int user_top; > + int quiet; > + int aa_only; > + int pretty_output; > }; > struct { > /* hist only */ > - int user_hist; > char no_irq; > char no_thread; > char no_header; > @@ -52,6 +51,8 @@ struct timerlat_params { > }; > }; > > +int timerlat_apply_config(struct osnoise_tool *tool, struct timerlat_params *params); > + > int timerlat_hist_main(int argc, char *argv[]); > int timerlat_top_main(int argc, char *argv[]); > int timerlat_main(int argc, char *argv[]); > diff --git a/tools/tracing/rtla/src/timerlat_hist.c b/tools/tracing/rtla/src/timerlat_hist.c > index 822c068b4776..9d9efeedc4c2 100644 > --- a/tools/tracing/rtla/src/timerlat_hist.c > +++ b/tools/tracing/rtla/src/timerlat_hist.c > @@ -315,7 +315,7 @@ static void timerlat_hist_header(struct osnoise_tool *tool) > if (!params->no_thread) > trace_seq_printf(s, " Thr-%03d", cpu); > > - if (params->user_hist) > + if (params->user_data) > trace_seq_printf(s, " Usr-%03d", cpu); > } > trace_seq_printf(s, "\n"); > @@ -371,7 +371,7 @@ timerlat_print_summary(struct timerlat_params *params, > trace_seq_printf(trace->seq, "%9llu ", > data->hist[cpu].thread_count); > > - if (params->user_hist) > + if (params->user_data) > trace_seq_printf(trace->seq, "%9llu ", > data->hist[cpu].user_count); > } > @@ -399,7 +399,7 @@ timerlat_print_summary(struct timerlat_params *params, > data->hist[cpu].min_thread, > false); > > - if (params->user_hist) > + if (params->user_data) > format_summary_value(trace->seq, > data->hist[cpu].user_count, > data->hist[cpu].min_user, > @@ -429,7 +429,7 @@ timerlat_print_summary(struct timerlat_params *params, > data->hist[cpu].sum_thread, > true); > > - if (params->user_hist) > + if (params->user_data) > format_summary_value(trace->seq, > data->hist[cpu].user_count, > data->hist[cpu].sum_user, > @@ -459,7 +459,7 @@ timerlat_print_summary(struct timerlat_params *params, > data->hist[cpu].max_thread, > false); > > - if (params->user_hist) > + if (params->user_data) > format_summary_value(trace->seq, > data->hist[cpu].user_count, > data->hist[cpu].max_user, > @@ -521,7 +521,7 @@ timerlat_print_stats_all(struct timerlat_params *params, > if (!params->no_thread) > trace_seq_printf(trace->seq, " Thr"); > > - if (params->user_hist) > + if (params->user_data) > trace_seq_printf(trace->seq, " Usr"); > > trace_seq_printf(trace->seq, "\n"); > @@ -537,7 +537,7 @@ timerlat_print_stats_all(struct timerlat_params *params, > trace_seq_printf(trace->seq, "%9llu ", > sum.thread_count); > > - if (params->user_hist) > + if (params->user_data) > trace_seq_printf(trace->seq, "%9llu ", > sum.user_count); > > @@ -558,7 +558,7 @@ timerlat_print_stats_all(struct timerlat_params *params, > sum.min_thread, > false); > > - if (params->user_hist) > + if (params->user_data) > format_summary_value(trace->seq, > sum.user_count, > sum.min_user, > @@ -581,7 +581,7 @@ timerlat_print_stats_all(struct timerlat_params *params, > sum.sum_thread, > true); > > - if (params->user_hist) > + if (params->user_data) > format_summary_value(trace->seq, > sum.user_count, > sum.sum_user, > @@ -604,7 +604,7 @@ timerlat_print_stats_all(struct timerlat_params *params, > sum.max_thread, > false); > > - if (params->user_hist) > + if (params->user_data) > format_summary_value(trace->seq, > sum.user_count, > sum.max_user, > @@ -654,7 +654,7 @@ timerlat_print_stats(struct timerlat_params *params, struct osnoise_tool *tool) > data->hist[cpu].thread[bucket]); > } > > - if (params->user_hist) { > + if (params->user_data) { > total += data->hist[cpu].user[bucket]; > trace_seq_printf(trace->seq, "%9d ", > data->hist[cpu].user[bucket]); > @@ -690,7 +690,7 @@ timerlat_print_stats(struct timerlat_params *params, struct osnoise_tool *tool) > trace_seq_printf(trace->seq, "%9d ", > data->hist[cpu].thread[data->entries]); > > - if (params->user_hist) > + if (params->user_data) > trace_seq_printf(trace->seq, "%9d ", > data->hist[cpu].user[data->entries]); > } > @@ -965,7 +965,7 @@ static struct timerlat_params > params->user_workload = 1; > /* fallback: -u implies in -U */ > case 'U': > - params->user_hist = 1; > + params->user_data = 1; > break; > case '0': /* no irq */ > params->no_irq = 1; > @@ -1063,98 +1063,11 @@ static struct timerlat_params > static int > timerlat_hist_apply_config(struct osnoise_tool *tool, struct timerlat_params *params) > { > - int retval, i; > - > - if (!params->sleep_time) > - params->sleep_time = 1; > - > - if (params->cpus) { > - retval = osnoise_set_cpus(tool->context, params->cpus); > - if (retval) { > - err_msg("Failed to apply CPUs config\n"); > - goto out_err; > - } > - } else { > - for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++) > - CPU_SET(i, ¶ms->monitored_cpus); > - } > - > - if (params->stop_us) { > - retval = osnoise_set_stop_us(tool->context, params->stop_us); > - if (retval) { > - err_msg("Failed to set stop us\n"); > - goto out_err; > - } > - } > - > - if (params->stop_total_us) { > - retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); > - if (retval) { > - err_msg("Failed to set stop total us\n"); > - goto out_err; > - } > - } > - > - if (params->timerlat_period_us) { > - retval = osnoise_set_timerlat_period_us(tool->context, params->timerlat_period_us); > - if (retval) { > - err_msg("Failed to set timerlat period\n"); > - goto out_err; > - } > - } > - > - if (params->print_stack) { > - retval = osnoise_set_print_stack(tool->context, params->print_stack); > - if (retval) { > - err_msg("Failed to set print stack\n"); > - goto out_err; > - } > - } > - > - if (params->hk_cpus) { > - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), > - ¶ms->hk_cpu_set); > - if (retval == -1) { > - err_msg("Failed to set rtla to the house keeping CPUs\n"); > - goto out_err; > - } > - } else if (params->cpus) { > - /* > - * Even if the user do not set a house-keeping CPU, try to > - * move rtla to a CPU set different to the one where the user > - * set the workload to run. > - * > - * No need to check results as this is an automatic attempt. > - */ > - auto_house_keeping(¶ms->monitored_cpus); > - } > - > - /* > - * If the user did not specify a type of thread, try user-threads first. > - * Fall back to kernel threads otherwise. > - */ > - if (!params->kernel_workload && !params->user_hist) { > - retval = tracefs_file_exists(NULL, "osnoise/per_cpu/cpu0/timerlat_fd"); > - if (retval) { > - debug_msg("User-space interface detected, setting user-threads\n"); > - params->user_workload = 1; > - params->user_hist = 1; > - } else { > - debug_msg("User-space interface not detected, setting kernel-threads\n"); > - params->kernel_workload = 1; > - } > - } > + int retval; > > - /* > - * Set workload according to type of thread if the kernel supports it. > - * On kernels without support, user threads will have already failed > - * on missing timerlat_fd, and kernel threads do not need it. > - */ > - retval = osnoise_set_workload(tool->context, params->kernel_workload); > - if (retval < -1) { > - err_msg("Failed to set OSNOISE_WORKLOAD option\n"); > + retval = timerlat_apply_config(tool, params); > + if (retval) > goto out_err; > - } > > return 0; > > diff --git a/tools/tracing/rtla/src/timerlat_top.c b/tools/tracing/rtla/src/timerlat_top.c > index c3196a0bb585..79cb6f28967f 100644 > --- a/tools/tracing/rtla/src/timerlat_top.c > +++ b/tools/tracing/rtla/src/timerlat_top.c > @@ -266,7 +266,7 @@ static void timerlat_top_header(struct timerlat_params *params, struct osnoise_t > trace_seq_printf(s, "\033[2;37;40m"); > > trace_seq_printf(s, " Timer Latency "); > - if (params->user_top) > + if (params->user_data) > trace_seq_printf(s, " "); > > if (params->pretty_output) > @@ -277,7 +277,7 @@ static void timerlat_top_header(struct timerlat_params *params, struct osnoise_t > params->output_divisor == 1 ? "ns" : "us", > params->output_divisor == 1 ? "ns" : "us"); > > - if (params->user_top) { > + if (params->user_data) { > trace_seq_printf(s, " | Ret user Timer Latency (%s)", > params->output_divisor == 1 ? "ns" : "us"); > } > @@ -287,7 +287,7 @@ static void timerlat_top_header(struct timerlat_params *params, struct osnoise_t > 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) > + if (params->user_data) > trace_seq_printf(s, " | cur min avg max"); > > if (params->pretty_output) > @@ -338,7 +338,7 @@ static void timerlat_top_print(struct osnoise_tool *top, int cpu) > trace_seq_printf(s, "%9llu", cpu_data->max_thread); > } > > - if (!params->user_top) { > + if (!params->user_data) { > trace_seq_printf(s, "\n"); > return; > } > @@ -380,7 +380,7 @@ timerlat_top_print_sum(struct osnoise_tool *top, struct timerlat_top_cpu *summar > } > > trace_seq_printf(s, "%.*s|%.*s|%.*s", 15, split, 40, split, 39, split); > - if (params->user_top) > + if (params->user_data) > trace_seq_printf(s, "-|%.*s", 39, split); > trace_seq_printf(s, "\n"); > > @@ -405,7 +405,7 @@ timerlat_top_print_sum(struct osnoise_tool *top, struct timerlat_top_cpu *summar > trace_seq_printf(s, "%9llu", summary->max_thread); > } > > - if (!params->user_top) { > + if (!params->user_data) { > trace_seq_printf(s, "\n"); > return; > } > @@ -722,7 +722,7 @@ static struct timerlat_params > params->user_workload = true; > /* fallback: -u implies -U */ > case 'U': > - params->user_top = true; > + params->user_data = true; > break; > case '0': /* trigger */ > if (params->events) { > @@ -800,100 +800,10 @@ static int > timerlat_top_apply_config(struct osnoise_tool *top, struct timerlat_params *params) > { > int retval; > - int i; > - > - if (!params->sleep_time) > - params->sleep_time = 1; > - > - if (params->cpus) { > - retval = osnoise_set_cpus(top->context, params->cpus); > - if (retval) { > - err_msg("Failed to apply CPUs config\n"); > - goto out_err; > - } > - } else { > - for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++) > - CPU_SET(i, ¶ms->monitored_cpus); > - } > - > - if (params->stop_us) { > - retval = osnoise_set_stop_us(top->context, params->stop_us); > - if (retval) { > - err_msg("Failed to set stop us\n"); > - goto out_err; > - } > - } > - > - if (params->stop_total_us) { > - retval = osnoise_set_stop_total_us(top->context, params->stop_total_us); > - if (retval) { > - err_msg("Failed to set stop total us\n"); > - goto out_err; > - } > - } > - > - > - if (params->timerlat_period_us) { > - retval = osnoise_set_timerlat_period_us(top->context, params->timerlat_period_us); > - if (retval) { > - err_msg("Failed to set timerlat period\n"); > - goto out_err; > - } > - } > > - > - if (params->print_stack) { > - retval = osnoise_set_print_stack(top->context, params->print_stack); > - if (retval) { > - err_msg("Failed to set print stack\n"); > - goto out_err; > - } > - } > - > - if (params->hk_cpus) { > - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), > - ¶ms->hk_cpu_set); > - if (retval == -1) { > - err_msg("Failed to set rtla to the house keeping CPUs\n"); > - goto out_err; > - } > - } else if (params->cpus) { > - /* > - * Even if the user do not set a house-keeping CPU, try to > - * move rtla to a CPU set different to the one where the user > - * set the workload to run. > - * > - * No need to check results as this is an automatic attempt. > - */ > - auto_house_keeping(¶ms->monitored_cpus); > - } > - > - /* > - * If the user did not specify a type of thread, try user-threads first. > - * Fall back to kernel threads otherwise. > - */ > - if (!params->kernel_workload && !params->user_top) { > - retval = tracefs_file_exists(NULL, "osnoise/per_cpu/cpu0/timerlat_fd"); > - if (retval) { > - debug_msg("User-space interface detected, setting user-threads\n"); > - params->user_workload = 1; > - params->user_top = 1; > - } else { > - debug_msg("User-space interface not detected, setting kernel-threads\n"); > - params->kernel_workload = 1; > - } > - } > - > - /* > - * Set workload according to type of thread if the kernel supports it. > - * On kernels without support, user threads will have already failed > - * on missing timerlat_fd, and kernel threads do not need it. > - */ > - retval = osnoise_set_workload(top->context, params->kernel_workload); > - if (retval < -1) { > - err_msg("Failed to set OSNOISE_WORKLOAD option\n"); > + retval = timerlat_apply_config(top, params); > + if (retval) > goto out_err; > - } > > if (isatty(STDOUT_FILENO) && !params->quiet) > params->pretty_output = 1; > @@ -1142,7 +1052,7 @@ int timerlat_top_main(int argc, char *argv[]) > } > } > > - if (params->cgroup && !params->user_top) { > + if (params->cgroup && !params->user_data) { > retval = set_comm_cgroup("timerlat/", params->cgroup_name); > if (!retval) { > err_msg("Failed to move threads to cgroup\n"); > -- > 2.48.1 > > > Reviewed-by: John Kacur <jkacur@redhat.com>
diff --git a/tools/tracing/rtla/src/osnoise.c b/tools/tracing/rtla/src/osnoise.c index 93d485c0e949..1735a36466c4 100644 --- a/tools/tracing/rtla/src/osnoise.c +++ b/tools/tracing/rtla/src/osnoise.c @@ -3,6 +3,7 @@ * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org> */ +#define _GNU_SOURCE #include <sys/types.h> #include <sys/stat.h> #include <pthread.h> @@ -12,6 +13,7 @@ #include <errno.h> #include <fcntl.h> #include <stdio.h> +#include <sched.h> #include "osnoise.h" @@ -1114,6 +1116,83 @@ osnoise_report_missed_events(struct osnoise_tool *tool) } } +/* + * osnoise_apply_config - apply common configs to the initialized tool + */ +int +osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params) +{ + int retval; + + if (!params->sleep_time) + params->sleep_time = 1; + + if (params->cpus) { + retval = osnoise_set_cpus(tool->context, params->cpus); + if (retval) { + err_msg("Failed to apply CPUs config\n"); + goto out_err; + } + } + + if (params->runtime || params->period) { + retval = osnoise_set_runtime_period(tool->context, + params->runtime, + params->period); + if (retval) { + err_msg("Failed to set runtime and/or period\n"); + goto out_err; + } + } + + if (params->stop_us) { + retval = osnoise_set_stop_us(tool->context, params->stop_us); + if (retval) { + err_msg("Failed to set stop us\n"); + goto out_err; + } + } + + if (params->stop_total_us) { + retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); + if (retval) { + err_msg("Failed to set stop total us\n"); + goto out_err; + } + } + + if (params->threshold) { + retval = osnoise_set_tracing_thresh(tool->context, params->threshold); + if (retval) { + err_msg("Failed to set tracing_thresh\n"); + goto out_err; + } + } + + if (params->hk_cpus) { + retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), + ¶ms->hk_cpu_set); + if (retval == -1) { + err_msg("Failed to set rtla to the house keeping CPUs\n"); + goto out_err; + } + } else if (params->cpus) { + /* + * Even if the user do not set a house-keeping CPU, try to + * move rtla to a CPU set different to the one where the user + * set the workload to run. + * + * No need to check results as this is an automatic attempt. + */ + auto_house_keeping(¶ms->monitored_cpus); + } + + return 0; + +out_err: + return -1; +} + static void osnoise_usage(int err) { int i; diff --git a/tools/tracing/rtla/src/osnoise.h b/tools/tracing/rtla/src/osnoise.h index f78ffbdc8c8d..ac1c99910744 100644 --- a/tools/tracing/rtla/src/osnoise.h +++ b/tools/tracing/rtla/src/osnoise.h @@ -155,6 +155,7 @@ struct osnoise_tool *osnoise_init_tool(char *tool_name); struct osnoise_tool *osnoise_init_trace_tool(char *tracer); void osnoise_report_missed_events(struct osnoise_tool *tool); bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record); +int osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params); int osnoise_hist_main(int argc, char *argv[]); int osnoise_top_main(int argc, char **argv); diff --git a/tools/tracing/rtla/src/osnoise_hist.c b/tools/tracing/rtla/src/osnoise_hist.c index 4721f15f77cd..d9d15c8f27c7 100644 --- a/tools/tracing/rtla/src/osnoise_hist.c +++ b/tools/tracing/rtla/src/osnoise_hist.c @@ -12,7 +12,6 @@ #include <errno.h> #include <stdio.h> #include <time.h> -#include <sched.h> #include "osnoise.h" @@ -705,68 +704,9 @@ osnoise_hist_apply_config(struct osnoise_tool *tool, struct osnoise_params *para { int retval; - if (!params->sleep_time) - params->sleep_time = 1; - - if (params->cpus) { - retval = osnoise_set_cpus(tool->context, params->cpus); - if (retval) { - err_msg("Failed to apply CPUs config\n"); - goto out_err; - } - } - - if (params->runtime || params->period) { - retval = osnoise_set_runtime_period(tool->context, - params->runtime, - params->period); - if (retval) { - err_msg("Failed to set runtime and/or period\n"); - goto out_err; - } - } - - if (params->stop_us) { - retval = osnoise_set_stop_us(tool->context, params->stop_us); - if (retval) { - err_msg("Failed to set stop us\n"); - goto out_err; - } - } - - if (params->stop_total_us) { - retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); - if (retval) { - err_msg("Failed to set stop total us\n"); - goto out_err; - } - } - - if (params->threshold) { - retval = osnoise_set_tracing_thresh(tool->context, params->threshold); - if (retval) { - err_msg("Failed to set tracing_thresh\n"); - goto out_err; - } - } - - if (params->hk_cpus) { - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), - ¶ms->hk_cpu_set); - if (retval == -1) { - err_msg("Failed to set rtla to the house keeping CPUs\n"); - goto out_err; - } - } else if (params->cpus) { - /* - * Even if the user do not set a house-keeping CPU, try to - * move rtla to a CPU set different to the one where the user - * set the workload to run. - * - * No need to check results as this is an automatic attempt. - */ - auto_house_keeping(¶ms->monitored_cpus); - } + retval = osnoise_apply_config(tool, params); + if (retval) + goto out_err; return 0; diff --git a/tools/tracing/rtla/src/osnoise_top.c b/tools/tracing/rtla/src/osnoise_top.c index 7f393019bbf5..3455ee73e2e6 100644 --- a/tools/tracing/rtla/src/osnoise_top.c +++ b/tools/tracing/rtla/src/osnoise_top.c @@ -11,7 +11,6 @@ #include <unistd.h> #include <stdio.h> #include <time.h> -#include <sched.h> #include "osnoise.h" @@ -523,50 +522,9 @@ osnoise_top_apply_config(struct osnoise_tool *tool, struct osnoise_params *param { int retval; - if (!params->sleep_time) - params->sleep_time = 1; - - if (params->cpus) { - retval = osnoise_set_cpus(tool->context, params->cpus); - if (retval) { - err_msg("Failed to apply CPUs config\n"); - goto out_err; - } - } - - if (params->runtime || params->period) { - retval = osnoise_set_runtime_period(tool->context, - params->runtime, - params->period); - if (retval) { - err_msg("Failed to set runtime and/or period\n"); - goto out_err; - } - } - - if (params->stop_us) { - retval = osnoise_set_stop_us(tool->context, params->stop_us); - if (retval) { - err_msg("Failed to set stop us\n"); - goto out_err; - } - } - - if (params->stop_total_us) { - retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); - if (retval) { - err_msg("Failed to set stop total us\n"); - goto out_err; - } - } - - if (params->threshold) { - retval = osnoise_set_tracing_thresh(tool->context, params->threshold); - if (retval) { - err_msg("Failed to set tracing_thresh\n"); - goto out_err; - } - } + retval = osnoise_apply_config(tool, params); + if (retval) + goto out_err; if (params->mode == MODE_HWNOISE) { retval = osnoise_set_irq_disable(tool->context, 1); @@ -576,24 +534,6 @@ osnoise_top_apply_config(struct osnoise_tool *tool, struct osnoise_params *param } } - if (params->hk_cpus) { - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), - ¶ms->hk_cpu_set); - if (retval == -1) { - err_msg("Failed to set rtla to the house keeping CPUs\n"); - goto out_err; - } - } else if (params->cpus) { - /* - * Even if the user do not set a house-keeping CPU, try to - * move rtla to a CPU set different to the one where the user - * set the workload to run. - * - * No need to check results as this is an automatic attempt. - */ - auto_house_keeping(¶ms->monitored_cpus); - } - if (isatty(STDOUT_FILENO) && !params->quiet) params->pretty_output = 1; diff --git a/tools/tracing/rtla/src/timerlat.c b/tools/tracing/rtla/src/timerlat.c index 21cdcc5c4a29..448fb1f7d3a6 100644 --- a/tools/tracing/rtla/src/timerlat.c +++ b/tools/tracing/rtla/src/timerlat.c @@ -2,6 +2,7 @@ /* * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org> */ +#define _GNU_SOURCE #include <sys/types.h> #include <sys/stat.h> #include <pthread.h> @@ -11,9 +12,117 @@ #include <errno.h> #include <fcntl.h> #include <stdio.h> +#include <sched.h> #include "timerlat.h" +/* + * timerlat_apply_config - apply common configs to the initialized tool + */ +int +timerlat_apply_config(struct osnoise_tool *tool, struct timerlat_params *params) +{ + int retval, i; + + if (!params->sleep_time) + params->sleep_time = 1; + + if (params->cpus) { + retval = osnoise_set_cpus(tool->context, params->cpus); + if (retval) { + err_msg("Failed to apply CPUs config\n"); + goto out_err; + } + } else { + for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++) + CPU_SET(i, ¶ms->monitored_cpus); + } + + if (params->stop_us) { + retval = osnoise_set_stop_us(tool->context, params->stop_us); + if (retval) { + err_msg("Failed to set stop us\n"); + goto out_err; + } + } + + if (params->stop_total_us) { + retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); + if (retval) { + err_msg("Failed to set stop total us\n"); + goto out_err; + } + } + + + if (params->timerlat_period_us) { + retval = osnoise_set_timerlat_period_us(tool->context, params->timerlat_period_us); + if (retval) { + err_msg("Failed to set timerlat period\n"); + goto out_err; + } + } + + + if (params->print_stack) { + retval = osnoise_set_print_stack(tool->context, params->print_stack); + if (retval) { + err_msg("Failed to set print stack\n"); + goto out_err; + } + } + + if (params->hk_cpus) { + retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), + ¶ms->hk_cpu_set); + if (retval == -1) { + err_msg("Failed to set rtla to the house keeping CPUs\n"); + goto out_err; + } + } else if (params->cpus) { + /* + * Even if the user do not set a house-keeping CPU, try to + * move rtla to a CPU set different to the one where the user + * set the workload to run. + * + * No need to check results as this is an automatic attempt. + */ + auto_house_keeping(¶ms->monitored_cpus); + } + + /* + * If the user did not specify a type of thread, try user-threads first. + * Fall back to kernel threads otherwise. + */ + if (!params->kernel_workload && !params->user_data) { + retval = tracefs_file_exists(NULL, "osnoise/per_cpu/cpu0/timerlat_fd"); + if (retval) { + debug_msg("User-space interface detected, setting user-threads\n"); + params->user_workload = 1; + params->user_data = 1; + } else { + debug_msg("User-space interface not detected, setting kernel-threads\n"); + params->kernel_workload = 1; + } + } + + /* + * Set workload according to type of thread if the kernel supports it. + * On kernels without support, user threads will have already failed + * on missing timerlat_fd, and kernel threads do not need it. + */ + retval = osnoise_set_workload(tool->context, params->kernel_workload); + if (retval < -1) { + err_msg("Failed to set OSNOISE_WORKLOAD option\n"); + goto out_err; + } + + return 0; + +out_err: + return -1; +} + static void timerlat_usage(int err) { int i; diff --git a/tools/tracing/rtla/src/timerlat.h b/tools/tracing/rtla/src/timerlat.h index cadc613dc82e..73045aef23fa 100644 --- a/tools/tracing/rtla/src/timerlat.h +++ b/tools/tracing/rtla/src/timerlat.h @@ -15,17 +15,15 @@ struct timerlat_params { int sleep_time; int output_divisor; int duration; - int quiet; int set_sched; int dma_latency; int no_aa; - int aa_only; int dump_tasks; int cgroup; int hk_cpus; int user_workload; int kernel_workload; - int pretty_output; + int user_data; int warmup; int buffer_size; int deepest_idle_state; @@ -35,11 +33,12 @@ struct timerlat_params { union { struct { /* top only */ - int user_top; + int quiet; + int aa_only; + int pretty_output; }; struct { /* hist only */ - int user_hist; char no_irq; char no_thread; char no_header; @@ -52,6 +51,8 @@ struct timerlat_params { }; }; +int timerlat_apply_config(struct osnoise_tool *tool, struct timerlat_params *params); + int timerlat_hist_main(int argc, char *argv[]); int timerlat_top_main(int argc, char *argv[]); int timerlat_main(int argc, char *argv[]); diff --git a/tools/tracing/rtla/src/timerlat_hist.c b/tools/tracing/rtla/src/timerlat_hist.c index 822c068b4776..9d9efeedc4c2 100644 --- a/tools/tracing/rtla/src/timerlat_hist.c +++ b/tools/tracing/rtla/src/timerlat_hist.c @@ -315,7 +315,7 @@ static void timerlat_hist_header(struct osnoise_tool *tool) if (!params->no_thread) trace_seq_printf(s, " Thr-%03d", cpu); - if (params->user_hist) + if (params->user_data) trace_seq_printf(s, " Usr-%03d", cpu); } trace_seq_printf(s, "\n"); @@ -371,7 +371,7 @@ timerlat_print_summary(struct timerlat_params *params, trace_seq_printf(trace->seq, "%9llu ", data->hist[cpu].thread_count); - if (params->user_hist) + if (params->user_data) trace_seq_printf(trace->seq, "%9llu ", data->hist[cpu].user_count); } @@ -399,7 +399,7 @@ timerlat_print_summary(struct timerlat_params *params, data->hist[cpu].min_thread, false); - if (params->user_hist) + if (params->user_data) format_summary_value(trace->seq, data->hist[cpu].user_count, data->hist[cpu].min_user, @@ -429,7 +429,7 @@ timerlat_print_summary(struct timerlat_params *params, data->hist[cpu].sum_thread, true); - if (params->user_hist) + if (params->user_data) format_summary_value(trace->seq, data->hist[cpu].user_count, data->hist[cpu].sum_user, @@ -459,7 +459,7 @@ timerlat_print_summary(struct timerlat_params *params, data->hist[cpu].max_thread, false); - if (params->user_hist) + if (params->user_data) format_summary_value(trace->seq, data->hist[cpu].user_count, data->hist[cpu].max_user, @@ -521,7 +521,7 @@ timerlat_print_stats_all(struct timerlat_params *params, if (!params->no_thread) trace_seq_printf(trace->seq, " Thr"); - if (params->user_hist) + if (params->user_data) trace_seq_printf(trace->seq, " Usr"); trace_seq_printf(trace->seq, "\n"); @@ -537,7 +537,7 @@ timerlat_print_stats_all(struct timerlat_params *params, trace_seq_printf(trace->seq, "%9llu ", sum.thread_count); - if (params->user_hist) + if (params->user_data) trace_seq_printf(trace->seq, "%9llu ", sum.user_count); @@ -558,7 +558,7 @@ timerlat_print_stats_all(struct timerlat_params *params, sum.min_thread, false); - if (params->user_hist) + if (params->user_data) format_summary_value(trace->seq, sum.user_count, sum.min_user, @@ -581,7 +581,7 @@ timerlat_print_stats_all(struct timerlat_params *params, sum.sum_thread, true); - if (params->user_hist) + if (params->user_data) format_summary_value(trace->seq, sum.user_count, sum.sum_user, @@ -604,7 +604,7 @@ timerlat_print_stats_all(struct timerlat_params *params, sum.max_thread, false); - if (params->user_hist) + if (params->user_data) format_summary_value(trace->seq, sum.user_count, sum.max_user, @@ -654,7 +654,7 @@ timerlat_print_stats(struct timerlat_params *params, struct osnoise_tool *tool) data->hist[cpu].thread[bucket]); } - if (params->user_hist) { + if (params->user_data) { total += data->hist[cpu].user[bucket]; trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].user[bucket]); @@ -690,7 +690,7 @@ timerlat_print_stats(struct timerlat_params *params, struct osnoise_tool *tool) trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].thread[data->entries]); - if (params->user_hist) + if (params->user_data) trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].user[data->entries]); } @@ -965,7 +965,7 @@ static struct timerlat_params params->user_workload = 1; /* fallback: -u implies in -U */ case 'U': - params->user_hist = 1; + params->user_data = 1; break; case '0': /* no irq */ params->no_irq = 1; @@ -1063,98 +1063,11 @@ static struct timerlat_params static int timerlat_hist_apply_config(struct osnoise_tool *tool, struct timerlat_params *params) { - int retval, i; - - if (!params->sleep_time) - params->sleep_time = 1; - - if (params->cpus) { - retval = osnoise_set_cpus(tool->context, params->cpus); - if (retval) { - err_msg("Failed to apply CPUs config\n"); - goto out_err; - } - } else { - for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++) - CPU_SET(i, ¶ms->monitored_cpus); - } - - if (params->stop_us) { - retval = osnoise_set_stop_us(tool->context, params->stop_us); - if (retval) { - err_msg("Failed to set stop us\n"); - goto out_err; - } - } - - if (params->stop_total_us) { - retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us); - if (retval) { - err_msg("Failed to set stop total us\n"); - goto out_err; - } - } - - if (params->timerlat_period_us) { - retval = osnoise_set_timerlat_period_us(tool->context, params->timerlat_period_us); - if (retval) { - err_msg("Failed to set timerlat period\n"); - goto out_err; - } - } - - if (params->print_stack) { - retval = osnoise_set_print_stack(tool->context, params->print_stack); - if (retval) { - err_msg("Failed to set print stack\n"); - goto out_err; - } - } - - if (params->hk_cpus) { - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), - ¶ms->hk_cpu_set); - if (retval == -1) { - err_msg("Failed to set rtla to the house keeping CPUs\n"); - goto out_err; - } - } else if (params->cpus) { - /* - * Even if the user do not set a house-keeping CPU, try to - * move rtla to a CPU set different to the one where the user - * set the workload to run. - * - * No need to check results as this is an automatic attempt. - */ - auto_house_keeping(¶ms->monitored_cpus); - } - - /* - * If the user did not specify a type of thread, try user-threads first. - * Fall back to kernel threads otherwise. - */ - if (!params->kernel_workload && !params->user_hist) { - retval = tracefs_file_exists(NULL, "osnoise/per_cpu/cpu0/timerlat_fd"); - if (retval) { - debug_msg("User-space interface detected, setting user-threads\n"); - params->user_workload = 1; - params->user_hist = 1; - } else { - debug_msg("User-space interface not detected, setting kernel-threads\n"); - params->kernel_workload = 1; - } - } + int retval; - /* - * Set workload according to type of thread if the kernel supports it. - * On kernels without support, user threads will have already failed - * on missing timerlat_fd, and kernel threads do not need it. - */ - retval = osnoise_set_workload(tool->context, params->kernel_workload); - if (retval < -1) { - err_msg("Failed to set OSNOISE_WORKLOAD option\n"); + retval = timerlat_apply_config(tool, params); + if (retval) goto out_err; - } return 0; diff --git a/tools/tracing/rtla/src/timerlat_top.c b/tools/tracing/rtla/src/timerlat_top.c index c3196a0bb585..79cb6f28967f 100644 --- a/tools/tracing/rtla/src/timerlat_top.c +++ b/tools/tracing/rtla/src/timerlat_top.c @@ -266,7 +266,7 @@ static void timerlat_top_header(struct timerlat_params *params, struct osnoise_t trace_seq_printf(s, "\033[2;37;40m"); trace_seq_printf(s, " Timer Latency "); - if (params->user_top) + if (params->user_data) trace_seq_printf(s, " "); if (params->pretty_output) @@ -277,7 +277,7 @@ static void timerlat_top_header(struct timerlat_params *params, struct osnoise_t params->output_divisor == 1 ? "ns" : "us", params->output_divisor == 1 ? "ns" : "us"); - if (params->user_top) { + if (params->user_data) { trace_seq_printf(s, " | Ret user Timer Latency (%s)", params->output_divisor == 1 ? "ns" : "us"); } @@ -287,7 +287,7 @@ static void timerlat_top_header(struct timerlat_params *params, struct osnoise_t 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) + if (params->user_data) trace_seq_printf(s, " | cur min avg max"); if (params->pretty_output) @@ -338,7 +338,7 @@ static void timerlat_top_print(struct osnoise_tool *top, int cpu) trace_seq_printf(s, "%9llu", cpu_data->max_thread); } - if (!params->user_top) { + if (!params->user_data) { trace_seq_printf(s, "\n"); return; } @@ -380,7 +380,7 @@ timerlat_top_print_sum(struct osnoise_tool *top, struct timerlat_top_cpu *summar } trace_seq_printf(s, "%.*s|%.*s|%.*s", 15, split, 40, split, 39, split); - if (params->user_top) + if (params->user_data) trace_seq_printf(s, "-|%.*s", 39, split); trace_seq_printf(s, "\n"); @@ -405,7 +405,7 @@ timerlat_top_print_sum(struct osnoise_tool *top, struct timerlat_top_cpu *summar trace_seq_printf(s, "%9llu", summary->max_thread); } - if (!params->user_top) { + if (!params->user_data) { trace_seq_printf(s, "\n"); return; } @@ -722,7 +722,7 @@ static struct timerlat_params params->user_workload = true; /* fallback: -u implies -U */ case 'U': - params->user_top = true; + params->user_data = true; break; case '0': /* trigger */ if (params->events) { @@ -800,100 +800,10 @@ static int timerlat_top_apply_config(struct osnoise_tool *top, struct timerlat_params *params) { int retval; - int i; - - if (!params->sleep_time) - params->sleep_time = 1; - - if (params->cpus) { - retval = osnoise_set_cpus(top->context, params->cpus); - if (retval) { - err_msg("Failed to apply CPUs config\n"); - goto out_err; - } - } else { - for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++) - CPU_SET(i, ¶ms->monitored_cpus); - } - - if (params->stop_us) { - retval = osnoise_set_stop_us(top->context, params->stop_us); - if (retval) { - err_msg("Failed to set stop us\n"); - goto out_err; - } - } - - if (params->stop_total_us) { - retval = osnoise_set_stop_total_us(top->context, params->stop_total_us); - if (retval) { - err_msg("Failed to set stop total us\n"); - goto out_err; - } - } - - - if (params->timerlat_period_us) { - retval = osnoise_set_timerlat_period_us(top->context, params->timerlat_period_us); - if (retval) { - err_msg("Failed to set timerlat period\n"); - goto out_err; - } - } - - if (params->print_stack) { - retval = osnoise_set_print_stack(top->context, params->print_stack); - if (retval) { - err_msg("Failed to set print stack\n"); - goto out_err; - } - } - - if (params->hk_cpus) { - retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set), - ¶ms->hk_cpu_set); - if (retval == -1) { - err_msg("Failed to set rtla to the house keeping CPUs\n"); - goto out_err; - } - } else if (params->cpus) { - /* - * Even if the user do not set a house-keeping CPU, try to - * move rtla to a CPU set different to the one where the user - * set the workload to run. - * - * No need to check results as this is an automatic attempt. - */ - auto_house_keeping(¶ms->monitored_cpus); - } - - /* - * If the user did not specify a type of thread, try user-threads first. - * Fall back to kernel threads otherwise. - */ - if (!params->kernel_workload && !params->user_top) { - retval = tracefs_file_exists(NULL, "osnoise/per_cpu/cpu0/timerlat_fd"); - if (retval) { - debug_msg("User-space interface detected, setting user-threads\n"); - params->user_workload = 1; - params->user_top = 1; - } else { - debug_msg("User-space interface not detected, setting kernel-threads\n"); - params->kernel_workload = 1; - } - } - - /* - * Set workload according to type of thread if the kernel supports it. - * On kernels without support, user threads will have already failed - * on missing timerlat_fd, and kernel threads do not need it. - */ - retval = osnoise_set_workload(top->context, params->kernel_workload); - if (retval < -1) { - err_msg("Failed to set OSNOISE_WORKLOAD option\n"); + retval = timerlat_apply_config(top, params); + if (retval) goto out_err; - } if (isatty(STDOUT_FILENO) && !params->quiet) params->pretty_output = 1; @@ -1142,7 +1052,7 @@ int timerlat_top_main(int argc, char *argv[]) } } - if (params->cgroup && !params->user_top) { + if (params->cgroup && !params->user_data) { retval = set_comm_cgroup("timerlat/", params->cgroup_name); if (!retval) { err_msg("Failed to move threads to cgroup\n");
The functions osnoise_top_apply_config and osnoise_hist_apply_config, as well as timerlat_top_apply_config and timerlat_hist_apply_config, are mostly the same. Move common part from them into separate functions osnoise_apply_config and timerlat_apply_config. For rtla-timerlat, also unify params->user_hist and params->user_top into one field called params->user_data, and move several fields used only by timerlat-top into the top-only section of struct timerlat_params. Signed-off-by: Tomas Glozar <tglozar@redhat.com> --- tools/tracing/rtla/src/osnoise.c | 79 ++++++++++++++++ tools/tracing/rtla/src/osnoise.h | 1 + tools/tracing/rtla/src/osnoise_hist.c | 66 +------------- tools/tracing/rtla/src/osnoise_top.c | 66 +------------- tools/tracing/rtla/src/timerlat.c | 109 ++++++++++++++++++++++ tools/tracing/rtla/src/timerlat.h | 11 +-- tools/tracing/rtla/src/timerlat_hist.c | 119 ++++--------------------- tools/tracing/rtla/src/timerlat_top.c | 110 +++-------------------- 8 files changed, 227 insertions(+), 334 deletions(-)