--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0 */
+#pragma once
+
+#include "utils.h"
+
+/*
+ * common_params - Parameters shared between timerlat_params and osnoise_params
+ */
+struct common_params {
+ /* trace configuration */
+ char *cpus;
+ cpu_set_t monitored_cpus;
+ struct trace_events *events;
+ int buffer_size;
+
+ /* Timing parameters */
+ int warmup;
+ long long stop_us;
+ long long stop_total_us;
+ int sleep_time;
+ int duration;
+
+ /* Scheduling parameters */
+ int set_sched;
+ struct sched_attr sched_param;
+ int cgroup;
+ char *cgroup_name;
+ int hk_cpus;
+ cpu_set_t hk_cpu_set;
+};
{
int retval;
- if (!params->sleep_time)
- params->sleep_time = 1;
+ if (!params->common.sleep_time)
+ params->common.sleep_time = 1;
- retval = osnoise_set_cpus(tool->context, params->cpus ? params->cpus : "all");
+ retval = osnoise_set_cpus(tool->context, params->common.cpus ? params->common.cpus : "all");
if (retval) {
err_msg("Failed to apply CPUs config\n");
goto out_err;
goto out_err;
}
- retval = osnoise_set_stop_us(tool->context, params->stop_us);
+ retval = osnoise_set_stop_us(tool->context, params->common.stop_us);
if (retval) {
err_msg("Failed to set stop us\n");
goto out_err;
}
- retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us);
+ retval = osnoise_set_stop_total_us(tool->context, params->common.stop_total_us);
if (retval) {
err_msg("Failed to set stop total us\n");
goto out_err;
goto out_err;
}
- if (params->hk_cpus) {
- retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set),
- ¶ms->hk_cpu_set);
+ if (params->common.hk_cpus) {
+ retval = sched_setaffinity(getpid(), sizeof(params->common.hk_cpu_set),
+ ¶ms->common.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) {
+ } else if (params->common.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
*
* No need to check results as this is an automatic attempt.
*/
- auto_house_keeping(¶ms->monitored_cpus);
+ auto_house_keeping(¶ms->common.monitored_cpus);
}
retval = osnoise_set_workload(tool->context, true);
// SPDX-License-Identifier: GPL-2.0
#pragma once
-#include "utils.h"
+#include "common.h"
#include "trace.h"
enum osnoise_mode {
};
struct osnoise_params {
- /* Common params */
- char *cpus;
- cpu_set_t monitored_cpus;
+ struct common_params common;
char *trace_output;
- char *cgroup_name;
unsigned long long runtime;
unsigned long long period;
long long threshold;
- long long stop_us;
- long long stop_total_us;
- int sleep_time;
- int duration;
- int set_sched;
- int cgroup;
- int hk_cpus;
- cpu_set_t hk_cpu_set;
- struct sched_attr sched_param;
- struct trace_events *events;
- int warmup;
- int buffer_size;
union {
struct {
/* top only */
trace_seq_printf(s, "Index");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
trace_seq_printf(trace->seq, "count:");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
trace_seq_printf(trace->seq, "min: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
trace_seq_printf(trace->seq, "avg: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
trace_seq_printf(trace->seq, "max: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
bucket * data->bucket_size);
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
trace_seq_printf(trace->seq, "over: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].count)
switch (c) {
case 'a':
/* set sample stop to auto_thresh */
- params->stop_us = get_llong_from_str(optarg);
+ params->common.stop_us = get_llong_from_str(optarg);
/* set sample threshold to 1 */
params->threshold = 1;
osnoise_hist_usage("Bucket size needs to be > 0 and <= 1000000\n");
break;
case 'c':
- retval = parse_cpu_set(optarg, ¶ms->monitored_cpus);
+ retval = parse_cpu_set(optarg, ¶ms->common.monitored_cpus);
if (retval)
osnoise_hist_usage("\nInvalid -c cpu list\n");
- params->cpus = optarg;
+ params->common.cpus = optarg;
break;
case 'C':
- params->cgroup = 1;
+ params->common.cgroup = 1;
if (!optarg) {
/* will inherit this cgroup */
- params->cgroup_name = NULL;
+ params->common.cgroup_name = NULL;
} else if (*optarg == '=') {
/* skip the = */
- params->cgroup_name = ++optarg;
+ params->common.cgroup_name = ++optarg;
}
break;
case 'D':
config_debug = 1;
break;
case 'd':
- params->duration = parse_seconds_duration(optarg);
- if (!params->duration)
+ params->common.duration = parse_seconds_duration(optarg);
+ if (!params->common.duration)
osnoise_hist_usage("Invalid -D duration\n");
break;
case 'e':
exit(EXIT_FAILURE);
}
- if (params->events)
- tevent->next = params->events;
+ if (params->common.events)
+ tevent->next = params->common.events;
- params->events = tevent;
+ params->common.events = tevent;
break;
case 'E':
params->entries = get_llong_from_str(optarg);
osnoise_hist_usage(NULL);
break;
case 'H':
- params->hk_cpus = 1;
- retval = parse_cpu_set(optarg, ¶ms->hk_cpu_set);
+ params->common.hk_cpus = 1;
+ retval = parse_cpu_set(optarg, ¶ms->common.hk_cpu_set);
if (retval) {
err_msg("Error parsing house keeping CPUs\n");
exit(EXIT_FAILURE);
osnoise_hist_usage("Period longer than 10 s\n");
break;
case 'P':
- retval = parse_prio(optarg, ¶ms->sched_param);
+ retval = parse_prio(optarg, ¶ms->common.sched_param);
if (retval == -1)
osnoise_hist_usage("Invalid -P priority");
- params->set_sched = 1;
+ params->common.set_sched = 1;
break;
case 'r':
params->runtime = get_llong_from_str(optarg);
osnoise_hist_usage("Runtime shorter than 100 us\n");
break;
case 's':
- params->stop_us = get_llong_from_str(optarg);
+ params->common.stop_us = get_llong_from_str(optarg);
break;
case 'S':
- params->stop_total_us = get_llong_from_str(optarg);
+ params->common.stop_total_us = get_llong_from_str(optarg);
break;
case 'T':
params->threshold = get_llong_from_str(optarg);
params->with_zeros = 1;
break;
case '4': /* trigger */
- if (params->events) {
- retval = trace_event_add_trigger(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_trigger(params->common.events, optarg);
if (retval) {
err_msg("Error adding trigger %s\n", optarg);
exit(EXIT_FAILURE);
}
break;
case '5': /* filter */
- if (params->events) {
- retval = trace_event_add_filter(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_filter(params->common.events, optarg);
if (retval) {
err_msg("Error adding filter %s\n", optarg);
exit(EXIT_FAILURE);
}
break;
case '6':
- params->warmup = get_llong_from_str(optarg);
+ params->common.warmup = get_llong_from_str(optarg);
break;
case '7':
- params->buffer_size = get_llong_from_str(optarg);
+ params->common.buffer_size = get_llong_from_str(optarg);
break;
default:
osnoise_hist_usage("Invalid option");
osnoise_hist_set_signals(struct osnoise_params *params)
{
signal(SIGINT, stop_hist);
- if (params->duration) {
+ if (params->common.duration) {
signal(SIGALRM, stop_hist);
- alarm(params->duration);
+ alarm(params->common.duration);
}
}
if (retval)
goto out_destroy;
- if (params->set_sched) {
- retval = set_comm_sched_attr("osnoise/", ¶ms->sched_param);
+ if (params->common.set_sched) {
+ retval = set_comm_sched_attr("osnoise/", ¶ms->common.sched_param);
if (retval) {
err_msg("Failed to set sched parameters\n");
goto out_free;
}
}
- if (params->cgroup) {
- retval = set_comm_cgroup("timerlat/", params->cgroup_name);
+ if (params->common.cgroup) {
+ retval = set_comm_cgroup("timerlat/", params->common.cgroup_name);
if (!retval) {
err_msg("Failed to move threads to cgroup\n");
goto out_free;
goto out_free;
}
- if (params->events) {
- retval = trace_events_enable(&record->trace, params->events);
+ if (params->common.events) {
+ retval = trace_events_enable(&record->trace, params->common.events);
if (retval)
goto out_hist;
}
- if (params->buffer_size > 0) {
- retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+ if (params->common.buffer_size > 0) {
+ retval = trace_set_buffer_size(&record->trace, params->common.buffer_size);
if (retval)
goto out_hist;
}
trace_instance_start(&record->trace);
trace_instance_start(trace);
- if (params->warmup > 0) {
- debug_msg("Warming up for %d seconds\n", params->warmup);
- sleep(params->warmup);
+ if (params->common.warmup > 0) {
+ debug_msg("Warming up for %d seconds\n", params->common.warmup);
+ sleep(params->common.warmup);
if (stop_tracing)
goto out_hist;
osnoise_hist_set_signals(params);
while (!stop_tracing) {
- sleep(params->sleep_time);
+ sleep(params->common.sleep_time);
retval = tracefs_iterate_raw_events(trace->tep,
trace->inst,
}
out_hist:
- trace_events_destroy(&record->trace, params->events);
- params->events = NULL;
+ trace_events_destroy(&record->trace, params->common.events);
+ params->common.events = NULL;
out_free:
osnoise_free_histogram(tool->data);
out_destroy:
osnoise_top_header(top);
for (i = 0; i < nr_cpus; i++) {
- if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(i, ¶ms->common.monitored_cpus))
continue;
osnoise_top_print(top, i);
}
switch (c) {
case 'a':
/* set sample stop to auto_thresh */
- params->stop_us = get_llong_from_str(optarg);
+ params->common.stop_us = get_llong_from_str(optarg);
/* set sample threshold to 1 */
params->threshold = 1;
break;
case 'c':
- retval = parse_cpu_set(optarg, ¶ms->monitored_cpus);
+ retval = parse_cpu_set(optarg, ¶ms->common.monitored_cpus);
if (retval)
osnoise_top_usage(params, "\nInvalid -c cpu list\n");
- params->cpus = optarg;
+ params->common.cpus = optarg;
break;
case 'C':
- params->cgroup = 1;
+ params->common.cgroup = 1;
if (!optarg) {
/* will inherit this cgroup */
- params->cgroup_name = NULL;
+ params->common.cgroup_name = NULL;
} else if (*optarg == '=') {
/* skip the = */
- params->cgroup_name = ++optarg;
+ params->common.cgroup_name = ++optarg;
}
break;
case 'D':
config_debug = 1;
break;
case 'd':
- params->duration = parse_seconds_duration(optarg);
- if (!params->duration)
+ params->common.duration = parse_seconds_duration(optarg);
+ if (!params->common.duration)
osnoise_top_usage(params, "Invalid -d duration\n");
break;
case 'e':
exit(EXIT_FAILURE);
}
- if (params->events)
- tevent->next = params->events;
- params->events = tevent;
+ if (params->common.events)
+ tevent->next = params->common.events;
+ params->common.events = tevent;
break;
case 'h':
osnoise_top_usage(params, NULL);
break;
case 'H':
- params->hk_cpus = 1;
- retval = parse_cpu_set(optarg, ¶ms->hk_cpu_set);
+ params->common.hk_cpus = 1;
+ retval = parse_cpu_set(optarg, ¶ms->common.hk_cpu_set);
if (retval) {
err_msg("Error parsing house keeping CPUs\n");
exit(EXIT_FAILURE);
osnoise_top_usage(params, "Period longer than 10 s\n");
break;
case 'P':
- retval = parse_prio(optarg, ¶ms->sched_param);
+ retval = parse_prio(optarg, ¶ms->common.sched_param);
if (retval == -1)
osnoise_top_usage(params, "Invalid -P priority");
- params->set_sched = 1;
+ params->common.set_sched = 1;
break;
case 'q':
params->quiet = 1;
osnoise_top_usage(params, "Runtime shorter than 100 us\n");
break;
case 's':
- params->stop_us = get_llong_from_str(optarg);
+ params->common.stop_us = get_llong_from_str(optarg);
break;
case 'S':
- params->stop_total_us = get_llong_from_str(optarg);
+ params->common.stop_total_us = get_llong_from_str(optarg);
break;
case 't':
if (optarg) {
params->threshold = get_llong_from_str(optarg);
break;
case '0': /* trigger */
- if (params->events) {
- retval = trace_event_add_trigger(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_trigger(params->common.events, optarg);
if (retval) {
err_msg("Error adding trigger %s\n", optarg);
exit(EXIT_FAILURE);
}
break;
case '1': /* filter */
- if (params->events) {
- retval = trace_event_add_filter(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_filter(params->common.events, optarg);
if (retval) {
err_msg("Error adding filter %s\n", optarg);
exit(EXIT_FAILURE);
}
break;
case '2':
- params->warmup = get_llong_from_str(optarg);
+ params->common.warmup = get_llong_from_str(optarg);
break;
case '3':
- params->buffer_size = get_llong_from_str(optarg);
+ params->common.buffer_size = get_llong_from_str(optarg);
break;
default:
osnoise_top_usage(params, "Invalid option");
static void osnoise_top_set_signals(struct osnoise_params *params)
{
signal(SIGINT, stop_top);
- if (params->duration) {
+ if (params->common.duration) {
signal(SIGALRM, stop_top);
- alarm(params->duration);
+ alarm(params->common.duration);
}
}
goto out_free;
}
- if (params->set_sched) {
- retval = set_comm_sched_attr("osnoise/", ¶ms->sched_param);
+ if (params->common.set_sched) {
+ retval = set_comm_sched_attr("osnoise/", ¶ms->common.sched_param);
if (retval) {
err_msg("Failed to set sched parameters\n");
goto out_free;
}
}
- if (params->cgroup) {
- retval = set_comm_cgroup("osnoise/", params->cgroup_name);
+ if (params->common.cgroup) {
+ retval = set_comm_cgroup("osnoise/", params->common.cgroup_name);
if (!retval) {
err_msg("Failed to move threads to cgroup\n");
goto out_free;
goto out_free;
}
- if (params->events) {
- retval = trace_events_enable(&record->trace, params->events);
+ if (params->common.events) {
+ retval = trace_events_enable(&record->trace, params->common.events);
if (retval)
goto out_top;
}
- if (params->buffer_size > 0) {
- retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+ if (params->common.buffer_size > 0) {
+ retval = trace_set_buffer_size(&record->trace, params->common.buffer_size);
if (retval)
goto out_top;
}
trace_instance_start(&record->trace);
trace_instance_start(trace);
- if (params->warmup > 0) {
- debug_msg("Warming up for %d seconds\n", params->warmup);
- sleep(params->warmup);
+ if (params->common.warmup > 0) {
+ debug_msg("Warming up for %d seconds\n", params->common.warmup);
+ sleep(params->common.warmup);
if (stop_tracing)
goto out_top;
osnoise_top_set_signals(params);
while (!stop_tracing) {
- sleep(params->sleep_time);
+ sleep(params->common.sleep_time);
retval = tracefs_iterate_raw_events(trace->tep,
trace->inst,
}
out_top:
- trace_events_destroy(&record->trace, params->events);
- params->events = NULL;
+ trace_events_destroy(&record->trace, params->common.events);
+ params->common.events = NULL;
out_free:
osnoise_free_top(tool->data);
osnoise_destroy_tool(record);
{
int retval, i;
- if (!params->sleep_time)
- params->sleep_time = 1;
+ if (!params->common.sleep_time)
+ params->common.sleep_time = 1;
- retval = osnoise_set_cpus(tool->context, params->cpus ? params->cpus : "all");
+ retval = osnoise_set_cpus(tool->context, params->common.cpus ? params->common.cpus : "all");
if (retval) {
err_msg("Failed to apply CPUs config\n");
goto out_err;
}
- if (!params->cpus) {
+ if (!params->common.cpus) {
for (i = 0; i < sysconf(_SC_NPROCESSORS_CONF); i++)
- CPU_SET(i, ¶ms->monitored_cpus);
+ CPU_SET(i, ¶ms->common.monitored_cpus);
}
if (params->mode != TRACING_MODE_BPF) {
* In tracefs and mixed mode, timerlat tracer handles stopping
* on threshold
*/
- retval = osnoise_set_stop_us(tool->context, params->stop_us);
+ retval = osnoise_set_stop_us(tool->context, params->common.stop_us);
if (retval) {
err_msg("Failed to set stop us\n");
goto out_err;
}
- retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us);
+ retval = osnoise_set_stop_total_us(tool->context, params->common.stop_total_us);
if (retval) {
err_msg("Failed to set stop total us\n");
goto out_err;
goto out_err;
}
- if (params->hk_cpus) {
- retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set),
- ¶ms->hk_cpu_set);
+ if (params->common.hk_cpus) {
+ retval = sched_setaffinity(getpid(), sizeof(params->common.hk_cpu_set),
+ ¶ms->common.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) {
+ } else if (params->common.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
*
* No need to check results as this is an automatic attempt.
*/
- auto_house_keeping(¶ms->monitored_cpus);
+ auto_house_keeping(¶ms->common.monitored_cpus);
}
/*
};
struct timerlat_params {
- /* Common params */
- char *cpus;
- cpu_set_t monitored_cpus;
- char *cgroup_name;
- unsigned long long runtime;
- long long stop_us;
- long long stop_total_us;
+ struct common_params common;
long long timerlat_period_us;
long long print_stack;
- int sleep_time;
int output_divisor;
- int duration;
- int set_sched;
int dma_latency;
int no_aa;
int dump_tasks;
- int cgroup;
- int hk_cpus;
int user_workload;
int kernel_workload;
int user_data;
- int warmup;
- int buffer_size;
int deepest_idle_state;
- cpu_set_t hk_cpu_set;
- struct sched_attr sched_param;
- struct trace_events *events;
enum timerlat_tracing_mode mode;
struct actions threshold_actions;
/* Pass common options */
bpf->rodata->output_divisor = params->output_divisor;
bpf->rodata->entries = params->entries;
- bpf->rodata->irq_threshold = params->stop_us;
- bpf->rodata->thread_threshold = params->stop_total_us;
+ bpf->rodata->irq_threshold = params->common.stop_us;
+ bpf->rodata->thread_threshold = params->common.stop_total_us;
bpf->rodata->aa_only = params->aa_only;
if (params->entries != 0) {
trace_seq_printf(s, "Index");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
trace_seq_printf(trace->seq, "count:");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
trace_seq_printf(trace->seq, "min: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
trace_seq_printf(trace->seq, "avg: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
trace_seq_printf(trace->seq, "max: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
sum.min_user = ~0;
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
bucket * data->bucket_size);
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
trace_seq_printf(trace->seq, "over: ");
for (cpu = 0; cpu < data->nr_cpus; cpu++) {
- if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus))
continue;
if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
auto_thresh = get_llong_from_str(optarg);
/* set thread stop to auto_thresh */
- params->stop_total_us = auto_thresh;
- params->stop_us = auto_thresh;
+ params->common.stop_total_us = auto_thresh;
+ params->common.stop_us = auto_thresh;
/* get stack trace */
params->print_stack = auto_thresh;
break;
case 'c':
- retval = parse_cpu_set(optarg, ¶ms->monitored_cpus);
+ retval = parse_cpu_set(optarg, ¶ms->common.monitored_cpus);
if (retval)
timerlat_hist_usage("\nInvalid -c cpu list\n");
- params->cpus = optarg;
+ params->common.cpus = optarg;
break;
case 'C':
- params->cgroup = 1;
+ params->common.cgroup = 1;
if (!optarg) {
/* will inherit this cgroup */
- params->cgroup_name = NULL;
+ params->common.cgroup_name = NULL;
} else if (*optarg == '=') {
/* skip the = */
- params->cgroup_name = ++optarg;
+ params->common.cgroup_name = ++optarg;
}
break;
case 'b':
config_debug = 1;
break;
case 'd':
- params->duration = parse_seconds_duration(optarg);
- if (!params->duration)
+ params->common.duration = parse_seconds_duration(optarg);
+ if (!params->common.duration)
timerlat_hist_usage("Invalid -D duration\n");
break;
case 'e':
exit(EXIT_FAILURE);
}
- if (params->events)
- tevent->next = params->events;
+ if (params->common.events)
+ tevent->next = params->common.events;
- params->events = tevent;
+ params->common.events = tevent;
break;
case 'E':
params->entries = get_llong_from_str(optarg);
timerlat_hist_usage(NULL);
break;
case 'H':
- params->hk_cpus = 1;
- retval = parse_cpu_set(optarg, ¶ms->hk_cpu_set);
+ params->common.hk_cpus = 1;
+ retval = parse_cpu_set(optarg, ¶ms->common.hk_cpu_set);
if (retval) {
err_msg("Error parsing house keeping CPUs\n");
exit(EXIT_FAILURE);
}
break;
case 'i':
- params->stop_us = get_llong_from_str(optarg);
+ params->common.stop_us = get_llong_from_str(optarg);
break;
case 'k':
params->kernel_workload = 1;
timerlat_hist_usage("Period longer than 1 s\n");
break;
case 'P':
- retval = parse_prio(optarg, ¶ms->sched_param);
+ retval = parse_prio(optarg, ¶ms->common.sched_param);
if (retval == -1)
timerlat_hist_usage("Invalid -P priority");
- params->set_sched = 1;
+ params->common.set_sched = 1;
break;
case 's':
params->print_stack = get_llong_from_str(optarg);
break;
case 'T':
- params->stop_total_us = get_llong_from_str(optarg);
+ params->common.stop_total_us = get_llong_from_str(optarg);
break;
case 't':
if (optarg) {
params->with_zeros = 1;
break;
case '6': /* trigger */
- if (params->events) {
- retval = trace_event_add_trigger(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_trigger(params->common.events, optarg);
if (retval) {
err_msg("Error adding trigger %s\n", optarg);
exit(EXIT_FAILURE);
}
break;
case '7': /* filter */
- if (params->events) {
- retval = trace_event_add_filter(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_filter(params->common.events, optarg);
if (retval) {
err_msg("Error adding filter %s\n", optarg);
exit(EXIT_FAILURE);
params->dump_tasks = 1;
break;
case '\2':
- params->warmup = get_llong_from_str(optarg);
+ params->common.warmup = get_llong_from_str(optarg);
break;
case '\3':
- params->buffer_size = get_llong_from_str(optarg);
+ params->common.buffer_size = get_llong_from_str(optarg);
break;
case '\4':
params->deepest_idle_state = get_llong_from_str(optarg);
/*
* Auto analysis only happens if stop tracing, thus:
*/
- if (!params->stop_us && !params->stop_total_us)
+ if (!params->common.stop_us && !params->common.stop_total_us)
params->no_aa = 1;
if (params->kernel_workload && params->user_workload)
timerlat_hist_set_signals(struct timerlat_params *params)
{
signal(SIGINT, stop_hist);
- if (params->duration) {
+ if (params->common.duration) {
signal(SIGALRM, stop_hist);
- alarm(params->duration);
+ alarm(params->common.duration);
}
}
goto out_free;
}
- if (params->set_sched) {
- retval = set_comm_sched_attr("timerlat/", ¶ms->sched_param);
+ if (params->common.set_sched) {
+ retval = set_comm_sched_attr("timerlat/", ¶ms->common.sched_param);
if (retval) {
err_msg("Failed to set sched parameters\n");
goto out_free;
}
}
- if (params->cgroup && !params->user_workload) {
- retval = set_comm_cgroup("timerlat/", params->cgroup_name);
+ if (params->common.cgroup && !params->user_workload) {
+ retval = set_comm_cgroup("timerlat/", params->common.cgroup_name);
if (!retval) {
err_msg("Failed to move threads to cgroup\n");
goto out_free;
nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
for (i = 0; i < nr_cpus; i++) {
- if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(i, ¶ms->common.monitored_cpus))
continue;
if (save_cpu_idle_disable_state(i) < 0) {
err_msg("Could not save cpu idle state.\n");
params->threshold_actions.trace_output_inst = record->trace.inst;
params->end_actions.trace_output_inst = record->trace.inst;
- if (params->events) {
- retval = trace_events_enable(&record->trace, params->events);
+ if (params->common.events) {
+ retval = trace_events_enable(&record->trace, params->common.events);
if (retval)
goto out_hist;
}
- if (params->buffer_size > 0) {
- retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+ if (params->common.buffer_size > 0) {
+ retval = trace_set_buffer_size(&record->trace, params->common.buffer_size);
if (retval)
goto out_hist;
}
/* all threads left */
params_u.stopped_running = 0;
- params_u.set = ¶ms->monitored_cpus;
- if (params->set_sched)
- params_u.sched_param = ¶ms->sched_param;
+ params_u.set = ¶ms->common.monitored_cpus;
+ if (params->common.set_sched)
+ params_u.sched_param = ¶ms->common.sched_param;
else
params_u.sched_param = NULL;
- params_u.cgroup_name = params->cgroup_name;
+ params_u.cgroup_name = params->common.cgroup_name;
retval = pthread_create(&timerlat_u, NULL, timerlat_u_dispatcher, ¶ms_u);
if (retval)
err_msg("Error creating timerlat user-space threads\n");
}
- if (params->warmup > 0) {
- debug_msg("Warming up for %d seconds\n", params->warmup);
- sleep(params->warmup);
+ if (params->common.warmup > 0) {
+ debug_msg("Warming up for %d seconds\n", params->common.warmup);
+ sleep(params->common.warmup);
if (stop_tracing)
goto out_hist;
}
if (params->mode == TRACING_MODE_TRACEFS) {
while (!stop_tracing) {
- sleep(params->sleep_time);
+ sleep(params->common.sleep_time);
retval = tracefs_iterate_raw_events(trace->tep,
trace->inst,
printf("rtla timerlat hit stop tracing\n");
if (!params->no_aa)
- timerlat_auto_analysis(params->stop_us, params->stop_total_us);
+ timerlat_auto_analysis(params->common.stop_us,
+ params->common.stop_total_us);
return_value = FAILED;
}
close(dma_latency_fd);
if (params->deepest_idle_state >= -1) {
for (i = 0; i < nr_cpus; i++) {
- if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(i, ¶ms->common.monitored_cpus))
continue;
restore_cpu_idle_disable_state(i);
}
}
- trace_events_destroy(&record->trace, params->events);
- params->events = NULL;
+ trace_events_destroy(&record->trace, params->common.events);
+ params->common.events = NULL;
out_free:
timerlat_free_histogram(tool->data);
osnoise_destroy_tool(aa);
timerlat_top_header(params, top);
for (i = 0; i < nr_cpus; i++) {
- if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(i, ¶ms->common.monitored_cpus))
continue;
timerlat_top_print(top, i);
timerlat_top_update_sum(top, i, &summary);
auto_thresh = get_llong_from_str(optarg);
/* set thread stop to auto_thresh */
- params->stop_total_us = auto_thresh;
- params->stop_us = auto_thresh;
+ params->common.stop_total_us = auto_thresh;
+ params->common.stop_us = auto_thresh;
/* get stack trace */
params->print_stack = auto_thresh;
auto_thresh = get_llong_from_str(optarg);
/* set thread stop to auto_thresh */
- params->stop_total_us = auto_thresh;
- params->stop_us = auto_thresh;
+ params->common.stop_total_us = auto_thresh;
+ params->common.stop_us = auto_thresh;
/* get stack trace */
params->print_stack = auto_thresh;
params->aa_only = 1;
break;
case 'c':
- retval = parse_cpu_set(optarg, ¶ms->monitored_cpus);
+ retval = parse_cpu_set(optarg, ¶ms->common.monitored_cpus);
if (retval)
timerlat_top_usage("\nInvalid -c cpu list\n");
- params->cpus = optarg;
+ params->common.cpus = optarg;
break;
case 'C':
- params->cgroup = 1;
+ params->common.cgroup = 1;
if (!optarg) {
/* will inherit this cgroup */
- params->cgroup_name = NULL;
+ params->common.cgroup_name = NULL;
} else if (*optarg == '=') {
/* skip the = */
- params->cgroup_name = ++optarg;
+ params->common.cgroup_name = ++optarg;
}
break;
case 'D':
config_debug = 1;
break;
case 'd':
- params->duration = parse_seconds_duration(optarg);
- if (!params->duration)
+ params->common.duration = parse_seconds_duration(optarg);
+ if (!params->common.duration)
timerlat_top_usage("Invalid -d duration\n");
break;
case 'e':
exit(EXIT_FAILURE);
}
- if (params->events)
- tevent->next = params->events;
- params->events = tevent;
+ if (params->common.events)
+ tevent->next = params->common.events;
+ params->common.events = tevent;
break;
case 'h':
case '?':
timerlat_top_usage(NULL);
break;
case 'H':
- params->hk_cpus = 1;
- retval = parse_cpu_set(optarg, ¶ms->hk_cpu_set);
+ params->common.hk_cpus = 1;
+ retval = parse_cpu_set(optarg, ¶ms->common.hk_cpu_set);
if (retval) {
err_msg("Error parsing house keeping CPUs\n");
exit(EXIT_FAILURE);
}
break;
case 'i':
- params->stop_us = get_llong_from_str(optarg);
+ params->common.stop_us = get_llong_from_str(optarg);
break;
case 'k':
params->kernel_workload = true;
timerlat_top_usage("Period longer than 1 s\n");
break;
case 'P':
- retval = parse_prio(optarg, ¶ms->sched_param);
+ retval = parse_prio(optarg, ¶ms->common.sched_param);
if (retval == -1)
timerlat_top_usage("Invalid -P priority");
- params->set_sched = 1;
+ params->common.set_sched = 1;
break;
case 'q':
params->quiet = 1;
params->print_stack = get_llong_from_str(optarg);
break;
case 'T':
- params->stop_total_us = get_llong_from_str(optarg);
+ params->common.stop_total_us = get_llong_from_str(optarg);
break;
case 't':
if (optarg) {
params->user_data = true;
break;
case '0': /* trigger */
- if (params->events) {
- retval = trace_event_add_trigger(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_trigger(params->common.events, optarg);
if (retval) {
err_msg("Error adding trigger %s\n", optarg);
exit(EXIT_FAILURE);
}
break;
case '1': /* filter */
- if (params->events) {
- retval = trace_event_add_filter(params->events, optarg);
+ if (params->common.events) {
+ retval = trace_event_add_filter(params->common.events, optarg);
if (retval) {
err_msg("Error adding filter %s\n", optarg);
exit(EXIT_FAILURE);
params->dump_tasks = 1;
break;
case '6':
- params->warmup = get_llong_from_str(optarg);
+ params->common.warmup = get_llong_from_str(optarg);
break;
case '7':
- params->buffer_size = get_llong_from_str(optarg);
+ params->common.buffer_size = get_llong_from_str(optarg);
break;
case '8':
params->deepest_idle_state = get_llong_from_str(optarg);
/*
* Auto analysis only happens if stop tracing, thus:
*/
- if (!params->stop_us && !params->stop_total_us)
+ if (!params->common.stop_us && !params->common.stop_total_us)
params->no_aa = 1;
if (params->no_aa && params->aa_only)
timerlat_top_set_signals(struct timerlat_params *params)
{
signal(SIGINT, stop_top);
- if (params->duration) {
+ if (params->common.duration) {
signal(SIGALRM, stop_top);
- alarm(params->duration);
+ alarm(params->common.duration);
}
}
int retval;
while (!stop_tracing) {
- sleep(params->sleep_time);
+ sleep(params->common.sleep_time);
if (params->aa_only && !osnoise_trace_is_off(top, record))
continue;
/* Pull and display data in a loop */
while (!stop_tracing) {
- wait_retval = timerlat_bpf_wait(params->quiet ? -1 : params->sleep_time);
+ wait_retval = timerlat_bpf_wait(params->quiet ? -1 : params->common.sleep_time);
retval = timerlat_top_bpf_pull_data(top);
if (retval) {
goto out_free;
}
- if (params->set_sched) {
- retval = set_comm_sched_attr("timerlat/", ¶ms->sched_param);
+ if (params->common.set_sched) {
+ retval = set_comm_sched_attr("timerlat/", ¶ms->common.sched_param);
if (retval) {
err_msg("Failed to set sched parameters\n");
goto out_free;
}
}
- if (params->cgroup && !params->user_data) {
- retval = set_comm_cgroup("timerlat/", params->cgroup_name);
+ if (params->common.cgroup && !params->user_data) {
+ retval = set_comm_cgroup("timerlat/", params->common.cgroup_name);
if (!retval) {
err_msg("Failed to move threads to cgroup\n");
goto out_free;
nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
for (i = 0; i < nr_cpus; i++) {
- if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(i, ¶ms->common.monitored_cpus))
continue;
if (save_cpu_idle_disable_state(i) < 0) {
err_msg("Could not save cpu idle state.\n");
params->threshold_actions.trace_output_inst = record->trace.inst;
params->end_actions.trace_output_inst = record->trace.inst;
- if (params->events) {
- retval = trace_events_enable(&record->trace, params->events);
+ if (params->common.events) {
+ retval = trace_events_enable(&record->trace, params->common.events);
if (retval)
goto out_top;
}
- if (params->buffer_size > 0) {
- retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+ if (params->common.buffer_size > 0) {
+ retval = trace_set_buffer_size(&record->trace, params->common.buffer_size);
if (retval)
goto out_top;
}
/* all threads left */
params_u.stopped_running = 0;
- params_u.set = ¶ms->monitored_cpus;
- if (params->set_sched)
- params_u.sched_param = ¶ms->sched_param;
+ params_u.set = ¶ms->common.monitored_cpus;
+ if (params->common.set_sched)
+ params_u.sched_param = ¶ms->common.sched_param;
else
params_u.sched_param = NULL;
- params_u.cgroup_name = params->cgroup_name;
+ params_u.cgroup_name = params->common.cgroup_name;
retval = pthread_create(&timerlat_u, NULL, timerlat_u_dispatcher, ¶ms_u);
if (retval)
err_msg("Error creating timerlat user-space threads\n");
}
- if (params->warmup > 0) {
- debug_msg("Warming up for %d seconds\n", params->warmup);
- sleep(params->warmup);
+ if (params->common.warmup > 0) {
+ debug_msg("Warming up for %d seconds\n", params->common.warmup);
+ sleep(params->common.warmup);
}
/*
printf("rtla timerlat hit stop tracing\n");
if (!params->no_aa)
- timerlat_auto_analysis(params->stop_us, params->stop_total_us);
+ timerlat_auto_analysis(params->common.stop_us,
+ params->common.stop_total_us);
return_value = FAILED;
} else if (params->aa_only) {
close(dma_latency_fd);
if (params->deepest_idle_state >= -1) {
for (i = 0; i < nr_cpus; i++) {
- if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus))
+ if (params->common.cpus && !CPU_ISSET(i, ¶ms->common.monitored_cpus))
continue;
restore_cpu_idle_disable_state(i);
}
}
- trace_events_destroy(&record->trace, params->events);
- params->events = NULL;
+ trace_events_destroy(&record->trace, params->common.events);
+ params->common.events = NULL;
out_free:
timerlat_free_top(top->data);
if (aa && aa != top)