From 3e75e90a8ee7a2079d1565261c24d3f025237950 Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Tue, 6 Nov 2018 07:10:11 +0100 Subject: [PATCH] env: add --huge-dir option Allow specifying a custom hugetlbfs directory. This can be useful e.g. when trying to use hugepages with fixed size, different size limit, or different access permissions. Change-Id: I418cbab99ed183383300b3c3d9945095a03478db Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.gerrithub.io/432105 Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- doc/applications.md | 1 + include/spdk/env.h | 1 + include/spdk/event.h | 1 + lib/env_dpdk/init.c | 8 ++++++++ lib/event/app.c | 7 +++++++ 5 files changed, 18 insertions(+) diff --git a/doc/applications.md b/doc/applications.md index 3da59abe3..9ab09f960 100644 --- a/doc/applications.md +++ b/doc/applications.md @@ -44,6 +44,7 @@ Param | Long Param | Type | Default | Descript -B | --pci-blacklist | B:D:F | | @ref cmd_arg_pci_blacklist_whitelist. -W | --pci-whitelist | B:D:F | | @ref cmd_arg_pci_blacklist_whitelist. -R | --huge-unlink | flag | | @ref cmd_arg_huge_unlink +| | --huge-dir | string | the first discovered | allocate hugepages from a specific mount -L | --traceflag | string | | @ref cmd_arg_debug_log_flags diff --git a/include/spdk/env.h b/include/spdk/env.h index 72d6c693b..4aff78d8a 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -82,6 +82,7 @@ struct spdk_env_opts { bool hugepage_single_segments; bool unlink_hugepage; size_t num_pci_addr; + const char *hugedir; struct spdk_pci_addr *pci_blacklist; struct spdk_pci_addr *pci_whitelist; diff --git a/include/spdk/event.h b/include/spdk/event.h index 2fa3f92e7..c1364b0e3 100644 --- a/include/spdk/event.h +++ b/include/spdk/event.h @@ -105,6 +105,7 @@ struct spdk_app_opts { bool no_pci; bool hugepage_single_segments; bool unlink_hugepage; + const char *hugedir; enum spdk_log_level print_level; size_t num_pci_addr; struct spdk_pci_addr *pci_blacklist; diff --git a/lib/env_dpdk/init.c b/lib/env_dpdk/init.c index 64988d5c0..8cb3ef286 100644 --- a/lib/env_dpdk/init.c +++ b/lib/env_dpdk/init.c @@ -267,6 +267,14 @@ spdk_build_eal_cmdline(const struct spdk_env_opts *opts) } } + /* use a specific hugetlbfs mount */ + if (opts->hugedir) { + args = spdk_push_arg(args, &argcount, _sprintf_alloc("--huge-dir=%s", opts->hugedir)); + if (args == NULL) { + return -1; + } + } + #if RTE_VERSION >= RTE_VERSION_NUM(18, 05, 0, 0) && RTE_VERSION < RTE_VERSION_NUM(18, 5, 1, 0) /* Dynamic memory management is buggy in DPDK 18.05.0. Don't use it. */ args = spdk_push_arg(args, &argcount, _sprintf_alloc("--legacy-mem")); diff --git a/lib/event/app.c b/lib/event/app.c index 830c18eba..afd639fc5 100644 --- a/lib/event/app.c +++ b/lib/event/app.c @@ -113,6 +113,8 @@ static const struct option g_cmdline_options[] = { {"silence-noticelog", no_argument, NULL, SILENCE_NOTICELOG_OPT_IDX}, #define WAIT_FOR_RPC_OPT_IDX 258 {"wait-for-rpc", no_argument, NULL, WAIT_FOR_RPC_OPT_IDX}, +#define HUGE_DIR_OPT_IDX 259 + {"huge-dir", no_argument, NULL, HUGE_DIR_OPT_IDX}, }; /* Global section */ @@ -486,6 +488,7 @@ spdk_app_setup_env(struct spdk_app_opts *opts) env_opts.mem_size = opts->mem_size; env_opts.hugepage_single_segments = opts->hugepage_single_segments; env_opts.unlink_hugepage = opts->unlink_hugepage; + env_opts.hugedir = opts->hugedir; env_opts.no_pci = opts->no_pci; env_opts.num_pci_addr = opts->num_pci_addr; env_opts.pci_blacklist = opts->pci_blacklist; @@ -731,6 +734,7 @@ usage(void (*app_usage)(void)) printf(" -R, --huge-unlink unlink huge files after initialization\n"); printf(" -W, --pci-whitelist \n"); printf(" pci addr to whitelist (-B and -W cannot be used at the same time)\n"); + printf(" --huge-dir use a specific hugetlbfs mount to reserve memory from\n"); spdk_tracelog_usage(stdout, "-L"); if (app_usage) { app_usage(); @@ -922,6 +926,9 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts, goto out; } break; + case HUGE_DIR_OPT_IDX: + opts->hugedir = optarg; + break; case '?': /* * In the event getopt() above detects an option