tools/rtla: Add fatal() and replace error handling pattern
The code contains some technical debt in error handling, which complicates the consolidation of duplicated code. Introduce an fatal() function to replace the common pattern of err_msg() followed by exit(EXIT_FAILURE), reducing the length of an already long function. Further patches using fatal() follow. Signed-off-by: Costa Shulyupin <costa.shul@redhat.com> Reviewed-by: Tomas Glozar <tglozar@redhat.com> Link: https://lore.kernel.org/r/20251011082738.173670-2-costa.shul@redhat.com Signed-off-by: Tomas Glozar <tglozar@redhat.com>pull/1354/merge
parent
34c170ae5c
commit
8cbb25db81
|
|
@ -575,10 +575,8 @@ static struct common_params
|
|||
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;
|
||||
|
|
@ -598,10 +596,8 @@ static struct common_params
|
|||
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);
|
||||
|
|
@ -654,10 +650,8 @@ static struct common_params
|
|||
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");
|
||||
}
|
||||
|
|
@ -665,10 +659,8 @@ static struct common_params
|
|||
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");
|
||||
}
|
||||
|
|
@ -682,18 +674,14 @@ static struct common_params
|
|||
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");
|
||||
|
|
@ -703,10 +691,8 @@ static struct common_params
|
|||
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");
|
||||
|
|
|
|||
|
|
@ -421,10 +421,8 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)
|
|||
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;
|
||||
|
|
@ -438,10 +436,8 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)
|
|||
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);
|
||||
|
|
@ -485,10 +481,8 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)
|
|||
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");
|
||||
}
|
||||
|
|
@ -496,10 +490,8 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)
|
|||
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");
|
||||
}
|
||||
|
|
@ -513,18 +505,14 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)
|
|||
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");
|
||||
|
|
@ -534,10 +522,8 @@ struct common_params *osnoise_top_parse_args(int argc, char **argv)
|
|||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -894,10 +894,8 @@ static struct common_params
|
|||
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;
|
||||
|
|
@ -917,10 +915,8 @@ static struct common_params
|
|||
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);
|
||||
|
|
@ -986,10 +982,8 @@ static struct common_params
|
|||
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");
|
||||
}
|
||||
|
|
@ -997,20 +991,16 @@ static struct common_params
|
|||
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;
|
||||
|
|
@ -1030,31 +1020,25 @@ static struct common_params
|
|||
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");
|
||||
|
|
|
|||
|
|
@ -666,10 +666,8 @@ static struct common_params
|
|||
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;
|
||||
|
|
@ -682,10 +680,8 @@ static struct common_params
|
|||
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);
|
||||
|
|
@ -736,10 +732,8 @@ static struct common_params
|
|||
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");
|
||||
}
|
||||
|
|
@ -747,20 +741,16 @@ static struct common_params
|
|||
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;
|
||||
|
|
@ -780,18 +770,14 @@ static struct common_params
|
|||
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");
|
||||
|
|
@ -801,10 +787,8 @@ static struct common_params
|
|||
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:
|
||||
|
|
|
|||
|
|
@ -51,10 +51,8 @@ static int timerlat_u_main(int cpu, struct timerlat_u_params *params)
|
|||
|
||||
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) {
|
||||
|
|
@ -78,10 +76,8 @@ static int timerlat_u_main(int cpu, struct timerlat_u_params *params)
|
|||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,21 @@ void debug_msg(const char *fmt, ...)
|
|||
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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue