event/app: add spdk_app_usage
This allows applications to trigger printing of the default SPDK command line option usage messages if needed. This could be useful in cases where the app expects the user to specify a parameter and finds the parameter was not specified after spdk_app_parse_args() is finished. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I6f2ebdfe1488091a539830f9e78e342a6c601382 Reviewed-on: https://review.gerrithub.io/414472 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
d39e7f22b1
commit
a2b5c37ac9
@ -236,6 +236,13 @@ spdk_app_parse_args_rvals_t spdk_app_parse_args(int argc, char **argv,
|
|||||||
struct spdk_app_opts *opts, const char *getopt_str,
|
struct spdk_app_opts *opts, const char *getopt_str,
|
||||||
void (*parse)(int ch, char *arg), void (*usage)(void));
|
void (*parse)(int ch, char *arg), void (*usage)(void));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print usage strings for common SPDK command line options.
|
||||||
|
*
|
||||||
|
* May only be called after spdk_app_parse_args().
|
||||||
|
*/
|
||||||
|
void spdk_app_usage(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate an event to be passed to spdk_event_call().
|
* Allocate an event to be passed to spdk_event_call().
|
||||||
*
|
*
|
||||||
|
@ -63,6 +63,8 @@ static struct spdk_event *g_shutdown_event = NULL;
|
|||||||
static int g_init_lcore;
|
static int g_init_lcore;
|
||||||
static bool g_delay_subsystem_init = false;
|
static bool g_delay_subsystem_init = false;
|
||||||
static bool g_shutdown_sig_received = false;
|
static bool g_shutdown_sig_received = false;
|
||||||
|
static char *g_executable_name;
|
||||||
|
static struct spdk_app_opts g_default_opts;
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_app_get_shm_id(void)
|
spdk_app_get_shm_id(void)
|
||||||
@ -614,11 +616,11 @@ spdk_app_stop(int rc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(char *executable_name, struct spdk_app_opts *default_opts, void (*app_usage)(void))
|
usage(void (*app_usage)(void))
|
||||||
{
|
{
|
||||||
printf("%s [options]\n", executable_name);
|
printf("%s [options]\n", g_executable_name);
|
||||||
printf("options:\n");
|
printf("options:\n");
|
||||||
printf(" -c config config file (default %s)\n", default_opts->config_file);
|
printf(" -c config config file (default %s)\n", g_default_opts.config_file);
|
||||||
printf(" -d disable coredump file enabling\n");
|
printf(" -d disable coredump file enabling\n");
|
||||||
printf(" -e mask tracepoint group mask for spdk trace buffers (default 0x0)\n");
|
printf(" -e mask tracepoint group mask for spdk trace buffers (default 0x0)\n");
|
||||||
printf(" -g force creating just one hugetlbfs file\n");
|
printf(" -g force creating just one hugetlbfs file\n");
|
||||||
@ -630,8 +632,8 @@ usage(char *executable_name, struct spdk_app_opts *default_opts, void (*app_usag
|
|||||||
printf(" -q disable notice level logging to stderr\n");
|
printf(" -q disable notice level logging to stderr\n");
|
||||||
printf(" -r RPC listen address (default %s)\n", SPDK_DEFAULT_RPC_ADDR);
|
printf(" -r RPC listen address (default %s)\n", SPDK_DEFAULT_RPC_ADDR);
|
||||||
printf(" -s size memory size in MB for DPDK (default: ");
|
printf(" -s size memory size in MB for DPDK (default: ");
|
||||||
if (default_opts->mem_size > 0) {
|
if (g_default_opts.mem_size > 0) {
|
||||||
printf("%dMB)\n", default_opts->mem_size);
|
printf("%dMB)\n", g_default_opts.mem_size);
|
||||||
} else {
|
} else {
|
||||||
printf("all hugepage memory)\n");
|
printf("all hugepage memory)\n");
|
||||||
}
|
}
|
||||||
@ -640,7 +642,9 @@ usage(char *executable_name, struct spdk_app_opts *default_opts, void (*app_usag
|
|||||||
printf(" -B addr pci addr to blacklist\n");
|
printf(" -B addr pci addr to blacklist\n");
|
||||||
printf(" -W addr pci addr to whitelist (-B and -W cannot be used at the same time)\n");
|
printf(" -W addr pci addr to whitelist (-B and -W cannot be used at the same time)\n");
|
||||||
spdk_tracelog_usage(stdout, "-t");
|
spdk_tracelog_usage(stdout, "-t");
|
||||||
app_usage();
|
if (app_usage) {
|
||||||
|
app_usage();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_app_parse_args_rvals_t
|
spdk_app_parse_args_rvals_t
|
||||||
@ -649,11 +653,10 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
void (*app_usage)(void))
|
void (*app_usage)(void))
|
||||||
{
|
{
|
||||||
int ch, rc;
|
int ch, rc;
|
||||||
struct spdk_app_opts default_opts;
|
|
||||||
char *getopt_str;
|
char *getopt_str;
|
||||||
spdk_app_parse_args_rvals_t rval = SPDK_APP_PARSE_ARGS_SUCCESS;
|
spdk_app_parse_args_rvals_t rval = SPDK_APP_PARSE_ARGS_SUCCESS;
|
||||||
|
|
||||||
memcpy(&default_opts, opts, sizeof(default_opts));
|
memcpy(&g_default_opts, opts, sizeof(g_default_opts));
|
||||||
|
|
||||||
if (opts->config_file && access(opts->config_file, F_OK) != 0) {
|
if (opts->config_file && access(opts->config_file, F_OK) != 0) {
|
||||||
opts->config_file = NULL;
|
opts->config_file = NULL;
|
||||||
@ -666,6 +669,8 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
goto parse_early_fail;
|
goto parse_early_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_executable_name = argv[0];
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, getopt_str)) != -1) {
|
while ((ch = getopt(argc, argv, getopt_str)) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'c':
|
case 'c':
|
||||||
@ -681,7 +686,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
opts->hugepage_single_segments = true;
|
opts->hugepage_single_segments = true;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_HELP;
|
rval = SPDK_APP_PARSE_ARGS_HELP;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
case 'i':
|
case 'i':
|
||||||
@ -721,7 +726,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
rc = spdk_parse_capacity(optarg, &mem_size_mb, &mem_size_has_prefix);
|
rc = spdk_parse_capacity(optarg, &mem_size_mb, &mem_size_has_prefix);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
fprintf(stderr, "invalid memory pool size `-s %s`\n", optarg);
|
fprintf(stderr, "invalid memory pool size `-s %s`\n", optarg);
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
}
|
}
|
||||||
@ -735,7 +740,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
|
|
||||||
if (mem_size_mb > INT_MAX) {
|
if (mem_size_mb > INT_MAX) {
|
||||||
fprintf(stderr, "invalid memory pool size `-s %s`\n", optarg);
|
fprintf(stderr, "invalid memory pool size `-s %s`\n", optarg);
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
}
|
}
|
||||||
@ -747,7 +752,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
rc = spdk_log_set_trace_flag(optarg);
|
rc = spdk_log_set_trace_flag(optarg);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
fprintf(stderr, "unknown flag\n");
|
fprintf(stderr, "unknown flag\n");
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
}
|
}
|
||||||
@ -755,7 +760,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
fprintf(stderr, "%s must be built with CONFIG_DEBUG=y for -t flag\n",
|
fprintf(stderr, "%s must be built with CONFIG_DEBUG=y for -t flag\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
#else
|
#else
|
||||||
@ -771,7 +776,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
if (opts->pci_whitelist) {
|
if (opts->pci_whitelist) {
|
||||||
free(opts->pci_whitelist);
|
free(opts->pci_whitelist);
|
||||||
fprintf(stderr, "-B and -W cannot be used at the same time\n");
|
fprintf(stderr, "-B and -W cannot be used at the same time\n");
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
}
|
}
|
||||||
@ -787,7 +792,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
if (opts->pci_blacklist) {
|
if (opts->pci_blacklist) {
|
||||||
free(opts->pci_blacklist);
|
free(opts->pci_blacklist);
|
||||||
fprintf(stderr, "-B and -W cannot be used at the same time\n");
|
fprintf(stderr, "-B and -W cannot be used at the same time\n");
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
}
|
}
|
||||||
@ -805,7 +810,7 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
|
|||||||
* in argv that is NOT in the getopt_str,
|
* in argv that is NOT in the getopt_str,
|
||||||
* getopt() will return a '?' indicating failure.
|
* getopt() will return a '?' indicating failure.
|
||||||
*/
|
*/
|
||||||
usage(argv[0], &default_opts, app_usage);
|
usage(app_usage);
|
||||||
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
rval = SPDK_APP_PARSE_ARGS_FAIL;
|
||||||
goto parse_done;
|
goto parse_done;
|
||||||
default:
|
default:
|
||||||
@ -827,6 +832,17 @@ parse_early_fail:
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
spdk_app_usage(void)
|
||||||
|
{
|
||||||
|
if (g_executable_name == NULL) {
|
||||||
|
fprintf(stderr, "%s not valid before calling spdk_app_parse_args()\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
usage(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
spdk_rpc_start_subsystem_init_cpl(void *arg1, void *arg2)
|
spdk_rpc_start_subsystem_init_cpl(void *arg1, void *arg2)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user