break;
case 'e':
tevent = trace_event_alloc(optarg);
- if (!tevent) {
- err_msg("Error alloc trace event");
- exit(EXIT_FAILURE);
- }
+ if (!tevent)
+ fatal("Error alloc trace event");
if (params->common.events)
tevent->next = params->common.events;
case 'H':
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);
- }
+ if (retval)
+ fatal("Error parsing house keeping CPUs");
break;
case 'p':
params->period = get_llong_from_str(optarg);
case '4': /* trigger */
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);
- }
+ if (retval)
+ fatal("Error adding trigger %s", optarg);
} else {
osnoise_hist_usage("--trigger requires a previous -e\n");
}
case '5': /* filter */
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);
- }
+ if (retval)
+ fatal("Error adding filter %s", optarg);
} else {
osnoise_hist_usage("--filter requires a previous -e\n");
}
case '8':
retval = actions_parse(¶ms->common.threshold_actions, optarg,
"osnoise_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
case '9':
retval = actions_parse(¶ms->common.end_actions, optarg,
"osnoise_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
default:
osnoise_hist_usage("Invalid option");
if (trace_output)
actions_add_trace_output(¶ms->common.threshold_actions, trace_output);
- if (geteuid()) {
- err_msg("rtla needs root permission\n");
- exit(EXIT_FAILURE);
- }
+ if (geteuid())
+ fatal("rtla needs root permission");
if (params->common.hist.no_index && !params->common.hist.with_zeros)
osnoise_hist_usage("no-index set and with-zeros not set - it does not make sense");
break;
case 'e':
tevent = trace_event_alloc(optarg);
- if (!tevent) {
- err_msg("Error alloc trace event");
- exit(EXIT_FAILURE);
- }
+ if (!tevent)
+ fatal("Error alloc trace event");
if (params->common.events)
tevent->next = params->common.events;
case 'H':
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);
- }
+ if (retval)
+ fatal("Error parsing house keeping CPUs");
break;
case 'p':
params->period = get_llong_from_str(optarg);
case '0': /* trigger */
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);
- }
+ if (retval)
+ fatal("Error adding trigger %s", optarg);
} else {
osnoise_top_usage(params, "--trigger requires a previous -e\n");
}
case '1': /* filter */
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);
- }
+ if (retval)
+ fatal("Error adding filter %s", optarg);
} else {
osnoise_top_usage(params, "--filter requires a previous -e\n");
}
case '4':
retval = actions_parse(¶ms->common.threshold_actions, optarg,
"osnoise_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
case '5':
retval = actions_parse(¶ms->common.end_actions, optarg,
"osnoise_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
default:
osnoise_top_usage(params, "Invalid option");
if (trace_output)
actions_add_trace_output(¶ms->common.threshold_actions, trace_output);
- if (geteuid()) {
- err_msg("osnoise needs root permission\n");
- exit(EXIT_FAILURE);
- }
+ if (geteuid())
+ fatal("osnoise needs root permission");
return ¶ms->common;
}
break;
case 'e':
tevent = trace_event_alloc(optarg);
- if (!tevent) {
- err_msg("Error alloc trace event");
- exit(EXIT_FAILURE);
- }
+ if (!tevent)
+ fatal("Error alloc trace event");
if (params->common.events)
tevent->next = params->common.events;
case 'H':
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);
- }
+ if (retval)
+ fatal("Error parsing house keeping CPUs");
break;
case 'i':
params->common.stop_us = get_llong_from_str(optarg);
case '6': /* trigger */
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);
- }
+ if (retval)
+ fatal("Error adding trigger %s", optarg);
} else {
timerlat_hist_usage("--trigger requires a previous -e\n");
}
case '7': /* filter */
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);
- }
+ if (retval)
+ fatal("Error adding filter %s", optarg);
} else {
timerlat_hist_usage("--filter requires a previous -e\n");
}
break;
case '8':
params->dma_latency = get_llong_from_str(optarg);
- if (params->dma_latency < 0 || params->dma_latency > 10000) {
- err_msg("--dma-latency needs to be >= 0 and < 10000");
- exit(EXIT_FAILURE);
- }
+ if (params->dma_latency < 0 || params->dma_latency > 10000)
+ fatal("--dma-latency needs to be >= 0 and < 10000");
break;
case '9':
params->no_aa = 1;
case '\5':
retval = actions_parse(¶ms->common.threshold_actions, optarg,
"timerlat_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
case '\6':
retval = actions_parse(¶ms->common.end_actions, optarg,
"timerlat_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
default:
- timerlat_hist_usage("Invalid option");
+ fatal("Invalid option");
}
}
if (trace_output)
actions_add_trace_output(¶ms->common.threshold_actions, trace_output);
- if (geteuid()) {
- err_msg("rtla needs root permission\n");
- exit(EXIT_FAILURE);
- }
+ if (geteuid())
+ fatal("rtla needs root permission");
if (params->common.hist.no_irq && params->common.hist.no_thread)
timerlat_hist_usage("no-irq and no-thread set, there is nothing to do here");
break;
case 'e':
tevent = trace_event_alloc(optarg);
- if (!tevent) {
- err_msg("Error alloc trace event");
- exit(EXIT_FAILURE);
- }
+ if (!tevent)
+ fatal("Error alloc trace event");
if (params->common.events)
tevent->next = params->common.events;
case 'H':
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);
- }
+ if (retval)
+ fatal("Error parsing house keeping CPUs");
break;
case 'i':
params->common.stop_us = get_llong_from_str(optarg);
case '0': /* trigger */
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);
- }
+ if (retval)
+ fatal("Error adding trigger %s", optarg);
} else {
timerlat_top_usage("--trigger requires a previous -e\n");
}
case '1': /* filter */
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);
- }
+ if (retval)
+ fatal("Error adding filter %s", optarg);
} else {
timerlat_top_usage("--filter requires a previous -e\n");
}
break;
case '2': /* dma-latency */
params->dma_latency = get_llong_from_str(optarg);
- if (params->dma_latency < 0 || params->dma_latency > 10000) {
- err_msg("--dma-latency needs to be >= 0 and < 10000");
- exit(EXIT_FAILURE);
- }
+ if (params->dma_latency < 0 || params->dma_latency > 10000)
+ fatal("--dma-latency needs to be >= 0 and < 10000");
break;
case '3': /* no-aa */
params->no_aa = 1;
case '9':
retval = actions_parse(¶ms->common.threshold_actions, optarg,
"timerlat_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
case '\1':
retval = actions_parse(¶ms->common.end_actions, optarg,
"timerlat_trace.txt");
- if (retval) {
- err_msg("Invalid action %s\n", optarg);
- exit(EXIT_FAILURE);
- }
+ if (retval)
+ fatal("Invalid action %s", optarg);
break;
default:
timerlat_top_usage("Invalid option");
if (trace_output)
actions_add_trace_output(¶ms->common.threshold_actions, trace_output);
- if (geteuid()) {
- err_msg("rtla needs root permission\n");
- exit(EXIT_FAILURE);
- }
+ if (geteuid())
+ fatal("rtla needs root permission");
/*
* Auto analysis only happens if stop tracing, thus:
if (!params->sched_param) {
retval = sched_setscheduler(0, SCHED_FIFO, &sp);
- if (retval < 0) {
- err_msg("Error setting timerlat u default priority: %s\n", strerror(errno));
- exit(1);
- }
+ if (retval < 0)
+ fatal("Error setting timerlat u default priority: %s", strerror(errno));
} else {
retval = __set_sched_attr(getpid(), params->sched_param);
if (retval) {
snprintf(buffer, sizeof(buffer), "osnoise/per_cpu/cpu%d/timerlat_fd", cpu);
timerlat_fd = tracefs_instance_file_open(NULL, buffer, O_RDONLY);
- if (timerlat_fd < 0) {
- err_msg("Error opening %s:%s\n", buffer, strerror(errno));
- exit(1);
- }
+ if (timerlat_fd < 0)
+ fatal("Error opening %s:%s", buffer, strerror(errno));
debug_msg("User-space timerlat pid %d on cpu %d\n", gettid(), cpu);
fprintf(stderr, "%s", message);
}
+/*
+ * fatal - print an error message and EOL to stderr and exit with ERROR
+ */
+void fatal(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+
+ exit(ERROR);
+}
+
/*
* get_llong_from_str - get a long long int from a string
*/
extern int config_debug;
void debug_msg(const char *fmt, ...);
void err_msg(const char *fmt, ...);
+void fatal(const char *fmt, ...);
long parse_seconds_duration(char *val);
void get_duration(time_t start_time, char *output, int output_size);