rtla_usage(), osnoise_usage() and timerlat_usage() all exit with an error status. However when these are called from help, they should exit with a non-error status. Fix this by passing the exit status to the functions. Note, although we remove the subsequent call to exit after calling usage, we leave it in at the end of a function to suppress the compiler warning "control reaches end of a non-void function". Link: https://lkml.kernel.org/r/20221107144313.22470-1-jkacur@redhat.com Signed-off-by: John Kacur <jkacur@redhat.com> Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
71 lines
1.5 KiB
C
71 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
|
|
*/
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <pthread.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
|
|
#include "timerlat.h"
|
|
|
|
static void timerlat_usage(int err)
|
|
{
|
|
int i;
|
|
|
|
static const char * const msg[] = {
|
|
"",
|
|
"timerlat version " VERSION,
|
|
"",
|
|
" usage: [rtla] timerlat [MODE] ...",
|
|
"",
|
|
" modes:",
|
|
" top - prints the summary from timerlat tracer",
|
|
" hist - prints a histogram of timer latencies",
|
|
"",
|
|
"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 timerlat_main(int argc, char *argv[])
|
|
{
|
|
if (argc == 0)
|
|
goto usage;
|
|
|
|
/*
|
|
* if timerlat was called without any argument, run the
|
|
* default cmdline.
|
|
*/
|
|
if (argc == 1) {
|
|
timerlat_top_main(argc, argv);
|
|
exit(0);
|
|
}
|
|
|
|
if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {
|
|
timerlat_usage(0);
|
|
} else if (strncmp(argv[1], "-", 1) == 0) {
|
|
/* the user skipped the tool, call the default one */
|
|
timerlat_top_main(argc, argv);
|
|
exit(0);
|
|
} else if (strcmp(argv[1], "top") == 0) {
|
|
timerlat_top_main(argc-1, &argv[1]);
|
|
exit(0);
|
|
} else if (strcmp(argv[1], "hist") == 0) {
|
|
timerlat_hist_main(argc-1, &argv[1]);
|
|
exit(0);
|
|
}
|
|
|
|
usage:
|
|
timerlat_usage(1);
|
|
exit(1);
|
|
}
|