/* *osnoise_set_timerlat_period_us-set"timerlat_period_us"
*/ int osnoise_set_timerlat_period_us(struct osnoise_context *context, longlong timerlat_period_us)
{ longlong curr_timerlat_period_us = osnoise_get_timerlat_period_us(context); int retval;
if (curr_timerlat_period_us == OSNOISE_TIME_INIT_VAL) return -1;
retval = osnoise_write_ll_config("osnoise/timerlat_period_us", timerlat_period_us); if (retval < 0) return -1;
context->timerlat_period_us = timerlat_period_us;
return0;
}
/* *osnoise_restore_timerlat_period_us-restore"timerlat_period_us"
*/ void osnoise_restore_timerlat_period_us(struct osnoise_context *context)
{ int retval;
if (context->orig_timerlat_period_us == OSNOISE_TIME_INIT_VAL) return;
if (context->orig_timerlat_period_us == context->timerlat_period_us) goto out_done;
retval = osnoise_write_ll_config("osnoise/timerlat_period_us", context->orig_timerlat_period_us); if (retval < 0)
err_msg("Could not restore original osnoise timerlat_period_us\n");
if (context->stop_us != OSNOISE_OPTION_INIT_VAL) return context->stop_us;
if (context->orig_stop_us != OSNOISE_OPTION_INIT_VAL) return context->orig_stop_us;
stop_us = osnoise_read_ll_config("osnoise/stop_tracing_us"); if (stop_us < 0) goto out_err;
context->orig_stop_us = stop_us; return stop_us;
out_err: return OSNOISE_OPTION_INIT_VAL;
}
/* *osnoise_set_stop_us-set"stop_tracing_us"
*/ int osnoise_set_stop_us(struct osnoise_context *context, longlong stop_us)
{ longlong curr_stop_us = osnoise_get_stop_us(context); int retval;
if (curr_stop_us == OSNOISE_OPTION_INIT_VAL) return -1;
retval = osnoise_write_ll_config("osnoise/stop_tracing_us", stop_us); if (retval < 0) return -1;
context->stop_us = stop_us;
return0;
}
/* *osnoise_restore_stop_us-restoretheoriginal"stop_tracing_us"
*/ void osnoise_restore_stop_us(struct osnoise_context *context)
{ int retval;
if (context->orig_stop_us == OSNOISE_OPTION_INIT_VAL) return;
if (context->orig_stop_us == context->stop_us) goto out_done;
retval = osnoise_write_ll_config("osnoise/stop_tracing_us", context->orig_stop_us); if (retval < 0)
err_msg("Could not restore original osnoise stop_us\n");
/* *osnoise_set_stop_total_us-set"stop_tracing_total_us"
*/ int osnoise_set_stop_total_us(struct osnoise_context *context, longlong stop_total_us)
{ longlong curr_stop_total_us = osnoise_get_stop_total_us(context); int retval;
if (curr_stop_total_us == OSNOISE_OPTION_INIT_VAL) return -1;
retval = osnoise_write_ll_config("osnoise/stop_tracing_total_us", stop_total_us); if (retval < 0) return -1;
context->stop_total_us = stop_total_us;
return0;
}
/* *osnoise_restore_stop_total_us-restoretheoriginal"stop_tracing_total_us"
*/ void osnoise_restore_stop_total_us(struct osnoise_context *context)
{ int retval;
if (context->orig_stop_total_us == OSNOISE_OPTION_INIT_VAL) return;
if (context->orig_stop_total_us == context->stop_total_us) goto out_done;
retval = osnoise_write_ll_config("osnoise/stop_tracing_total_us",
context->orig_stop_total_us); if (retval < 0)
err_msg("Could not restore original osnoise stop_total_us\n");
/* *osnoise_set_print_stack-set"print_stack"
*/ int osnoise_set_print_stack(struct osnoise_context *context, longlong print_stack)
{ longlong curr_print_stack = osnoise_get_print_stack(context); int retval;
if (curr_print_stack == OSNOISE_OPTION_INIT_VAL) return -1;
retval = osnoise_write_ll_config("osnoise/print_stack", print_stack); if (retval < 0) return -1;
context->print_stack = print_stack;
return0;
}
/* *osnoise_restore_print_stack-restoretheoriginal"print_stack"
*/ void osnoise_restore_print_stack(struct osnoise_context *context)
{ int retval;
if (context->orig_print_stack == OSNOISE_OPTION_INIT_VAL) return;
if (context->orig_print_stack == context->print_stack) goto out_done;
retval = osnoise_write_ll_config("osnoise/print_stack", context->orig_print_stack); if (retval < 0)
err_msg("Could not restore original osnoise print_stack\n");
/* *osnoise_set_tracing_thresh-set"tracing_thresh"
*/ int osnoise_set_tracing_thresh(struct osnoise_context *context, longlong tracing_thresh)
{ longlong curr_tracing_thresh = osnoise_get_tracing_thresh(context); int retval;
if (curr_tracing_thresh == OSNOISE_OPTION_INIT_VAL) return -1;
retval = osnoise_write_ll_config("tracing_thresh", tracing_thresh); if (retval < 0) return -1;
context->tracing_thresh = tracing_thresh;
return0;
}
/* *osnoise_restore_tracing_thresh-restoretheoriginal"tracing_thresh"
*/ void osnoise_restore_tracing_thresh(struct osnoise_context *context)
{ int retval;
if (context->orig_tracing_thresh == OSNOISE_OPTION_INIT_VAL) return;
if (context->orig_tracing_thresh == context->tracing_thresh) goto out_done;
retval = osnoise_write_ll_config("tracing_thresh", context->orig_tracing_thresh); if (retval < 0)
err_msg("Could not restore original tracing_thresh\n");
int osnoise_set_irq_disable(struct osnoise_context *context, bool onoff)
{ int opt_irq_disable = osnoise_get_irq_disable(context); int retval;
if (opt_irq_disable == OSNOISE_OPTION_INIT_VAL) return -1;
if (opt_irq_disable == onoff) return0;
retval = osnoise_options_set_option("OSNOISE_IRQ_DISABLE", onoff); if (retval < 0) return -1;
context->opt_irq_disable = onoff;
return0;
}
staticvoid osnoise_restore_irq_disable(struct osnoise_context *context)
{ int retval;
if (context->orig_opt_irq_disable == OSNOISE_OPTION_INIT_VAL) return;
if (context->orig_opt_irq_disable == context->opt_irq_disable) goto out_done;
retval = osnoise_options_set_option("OSNOISE_IRQ_DISABLE", context->orig_opt_irq_disable); if (retval < 0)
err_msg("Could not restore original OSNOISE_IRQ_DISABLE option\n");
int osnoise_set_workload(struct osnoise_context *context, bool onoff)
{ int opt_workload = osnoise_get_workload(context); int retval;
if (opt_workload == OSNOISE_OPTION_INIT_VAL) return -1;
if (opt_workload == onoff) return0;
retval = osnoise_options_set_option("OSNOISE_WORKLOAD", onoff); if (retval < 0) return -2;
context->opt_workload = onoff;
return0;
}
staticvoid osnoise_restore_workload(struct osnoise_context *context)
{ int retval;
if (context->orig_opt_workload == OSNOISE_OPTION_INIT_VAL) return;
if (context->orig_opt_workload == context->opt_workload) goto out_done;
retval = osnoise_options_set_option("OSNOISE_WORKLOAD", context->orig_opt_workload); if (retval < 0)
err_msg("Could not restore original OSNOISE_WORKLOAD option\n");
if (tool->trace.missed_events == UINT64_MAX)
printf("unknown number of events missed, results might not be accurate\n"); elseif (tool->trace.missed_events > 0) {
total_events = tool->trace.processed_events + tool->trace.missed_events;
printf("%lld (%.2f%%) events missed, results might not be accurate\n",
tool->trace.missed_events,
(double) tool->trace.missed_events / total_events * 100.0);
}
}
/* *osnoise_apply_config-applycommonconfigstotheinitializedtool
*/ int
osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params)
{ int retval;
if (!params->sleep_time)
params->sleep_time = 1;
retval = osnoise_set_cpus(tool->context, params->cpus ? params->cpus : "all"); if (retval) {
err_msg("Failed to apply CPUs config\n"); goto out_err;
}
if (retval) {
err_msg("Failed to set runtime and/or period\n"); goto out_err;
}
retval = osnoise_set_stop_us(tool->context, params->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); if (retval) {
err_msg("Failed to set stop total us\n"); goto out_err;
}
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;
}
} elseif (params->cpus) { /* *Eveniftheuserdonotsetahouse-keepingCPU,tryto *movertlatoaCPUsetdifferenttotheonewheretheuser *settheworkloadtorun. * *Noneedtocheckresultsasthisisanautomaticattempt.
*/
auto_house_keeping(¶ms->monitored_cpus);
}
retval = osnoise_set_workload(tool->context, true); if (retval < -1) {
err_msg("Failed to set OSNOISE_WORKLOAD option\n"); goto out_err;
}
return0;
out_err: return -1;
}
staticvoid osnoise_usage(int err)
{ int i;
staticconstchar *msg[] = { "", "osnoise version " VERSION, "", " usage: [rtla] osnoise [MODE] ...", "", " modes:", " top - prints the summary from osnoise tracer", " hist - prints a histogram of osnoise samples", "", "if no MODE is given, the top mode is called, passing the arguments",
NULL,
};
for (i = 0; msg[i]; i++)
fprintf(stderr, "%s\n", msg[i]); exit(err);
}
int osnoise_main(int argc, char *argv[])
{ if (argc == 0) goto usage;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.