get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/71843/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 71843,
    "url": "http://patches.dpdk.org/api/patches/71843/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200621102612.22740-2-talshn@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200621102612.22740-2-talshn@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200621102612.22740-2-talshn@mellanox.com",
    "date": "2020-06-21T10:26:04",
    "name": "[v7,1/9] eal: move OS common functions to single file",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "7d935d6b587dba85b4abfedfde755ef4ffa7e1e7",
    "submitter": {
        "id": 1669,
        "url": "http://patches.dpdk.org/api/people/1669/?format=api",
        "name": "Tal Shnaiderman",
        "email": "talshn@mellanox.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200621102612.22740-2-talshn@mellanox.com/mbox/",
    "series": [
        {
            "id": 10531,
            "url": "http://patches.dpdk.org/api/series/10531/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=10531",
            "date": "2020-06-21T10:26:09",
            "name": "Windows bus/pci support",
            "version": 7,
            "mbox": "http://patches.dpdk.org/series/10531/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/71843/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/71843/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 70F06A0350;\n\tSun, 21 Jun 2020 12:27:37 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 39A941C0C9;\n\tSun, 21 Jun 2020 12:26:37 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id 539111C02A\n for <dev@dpdk.org>; Sun, 21 Jun 2020 12:26:25 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n talshn@mellanox.com) with SMTP; 21 Jun 2020 13:26:19 +0300",
            "from l-wincomp04-vm.labs.mlnx (l-wincomp04-vm.mtl.labs.mlnx\n [10.237.1.5])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 05LAQJGu007270;\n Sun, 21 Jun 2020 13:26:19 +0300"
        ],
        "From": "talshn@mellanox.com",
        "To": "dev@dpdk.org",
        "Cc": "thomas@monjalon.net, pallavi.kadam@intel.com, dmitry.kozliuk@gmail.com,\n david.marchand@redhat.com, grive@u256.net, ranjit.menon@intel.com,\n navasile@linux.microsoft.com, harini.ramakrishnan@microsoft.com,\n ocardona@microsoft.com, anatoly.burakov@intel.com, fady@mellanox.com,\n bruce.richardson@intel.com, Tal Shnaiderman <talshn@mellanox.com>",
        "Date": "Sun, 21 Jun 2020 13:26:04 +0300",
        "Message-Id": "<20200621102612.22740-2-talshn@mellanox.com>",
        "X-Mailer": "git-send-email 2.16.1.windows.4",
        "In-Reply-To": "<20200621102612.22740-1-talshn@mellanox.com>",
        "References": "<20200618211546.24496-2-talshn@mellanox.com>\n <20200621102612.22740-1-talshn@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v7 1/9] eal: move OS common functions to single\n\tfile",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Tal Shnaiderman <talshn@mellanox.com>\n\nMove common functions between Unix and Windows to eal_common_config.c.\n\nThose functions are getter functions for IOVA,\nconfiguration, Multi-process.\n\nMove rte_config, internal_config, early_mem_config and runtime_dir\nto be defined in a common file.\n\nSigned-off-by: Tal Shnaiderman <talshn@mellanox.com>\n---\n lib/librte_eal/common/eal_common_config.c | 118 ++++++++++++++\n lib/librte_eal/common/eal_private.h       |   1 +\n lib/librte_eal/common/meson.build         |   2 +\n lib/librte_eal/freebsd/Makefile           |   1 +\n lib/librte_eal/freebsd/eal.c              | 231 ++++++++++-----------------\n lib/librte_eal/include/rte_eal.h          |  13 ++\n lib/librte_eal/linux/Makefile             |   1 +\n lib/librte_eal/linux/eal.c                | 253 +++++++++++++-----------------\n lib/librte_eal/windows/eal.c              |  90 +++--------\n 9 files changed, 353 insertions(+), 357 deletions(-)\n create mode 100644 lib/librte_eal/common/eal_common_config.c",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_config.c b/lib/librte_eal/common/eal_common_config.c\nnew file mode 100644\nindex 0000000000..4a61972539\n--- /dev/null\n+++ b/lib/librte_eal/common/eal_common_config.c\n@@ -0,0 +1,118 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Mellanox Technologies, Ltd\n+ */\n+#include <string.h>\n+\n+#include <rte_os.h>\n+\n+#include <eal_private.h>\n+#include <eal_memcfg.h>\n+\n+/* early configuration structure, when memory config is not mmapped */\n+static struct rte_mem_config early_mem_config;\n+\n+/* Address of global and public configuration */\n+static struct rte_config rte_config = {\n+\t.mem_config = &early_mem_config,\n+};\n+\n+/* platform-specific runtime dir */\n+static char runtime_dir[PATH_MAX];\n+\n+/* internal configuration */\n+struct internal_config internal_config;\n+\n+/* Allow the application to print its usage message too if set */\n+static rte_usage_hook_t\trte_application_usage_hook = NULL;\n+\n+const char *\n+rte_eal_get_runtime_dir(void)\n+{\n+\treturn runtime_dir;\n+}\n+\n+void\n+rte_eal_set_runtime_dir(char *run_dir, size_t size)\n+{\n+\tstrncpy(runtime_dir, run_dir, size);\n+}\n+\n+/* Return a pointer to the configuration structure */\n+struct rte_config *\n+rte_eal_get_configuration(void)\n+{\n+\treturn &rte_config;\n+}\n+\n+/* Return a pointer to theinternal configuration structure */\n+struct internal_config *\n+rte_eal_get_internal_configuration(void)\n+{\n+\treturn &internal_config;\n+}\n+\n+/* Return a pointer to rte_usage_hook_t */\n+rte_usage_hook_t *\n+rte_eal_get_application_usage_hook(void)\n+{\n+\treturn &rte_application_usage_hook;\n+}\n+\n+enum rte_iova_mode\n+rte_eal_iova_mode(void)\n+{\n+\treturn rte_eal_get_configuration()->iova_mode;\n+}\n+\n+enum rte_proc_type_t\n+rte_eal_process_type(void)\n+{\n+\treturn rte_config.process_type;\n+}\n+\n+void\n+rte_eal_config_remap(void *mem_cfg_addr)\n+{\n+\tmemcpy(mem_cfg_addr, &early_mem_config, sizeof(early_mem_config));\n+\trte_config.mem_config = mem_cfg_addr;\n+\n+\t/* store address of the config in the config itself so that secondary\n+\t * processes could later map the config into this exact location\n+\t */\n+\trte_config.mem_config->mem_cfg_addr = (uintptr_t) mem_cfg_addr;\n+\n+\trte_config.mem_config->dma_maskbits = 0;\n+}\n+\n+/* Return user provided mbuf pool ops name */\n+const char *\n+rte_eal_mbuf_user_pool_ops(void)\n+{\n+\treturn internal_config.user_mbuf_pool_ops_name;\n+}\n+\n+/* Set a per-application usage message */\n+rte_usage_hook_t\n+rte_set_application_usage_hook(rte_usage_hook_t usage_func)\n+{\n+\trte_usage_hook_t\told_func;\n+\n+\t/* Will be NULL on the first call to denote the last usage routine. */\n+\told_func = rte_application_usage_hook;\n+\trte_application_usage_hook = usage_func;\n+\n+\treturn old_func;\n+}\n+\n+/* return non-zero if hugepages are enabled. */\n+int\n+rte_eal_has_hugepages(void)\n+{\n+\treturn !internal_config.no_hugetlbfs;\n+}\n+\n+int\n+rte_eal_has_pci(void)\n+{\n+\treturn !internal_config.no_pci;\n+}\ndiff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h\nindex 0592fcd694..97cfd6a325 100644\n--- a/lib/librte_eal/common/eal_private.h\n+++ b/lib/librte_eal/common/eal_private.h\n@@ -62,6 +62,7 @@ struct rte_config {\n \tstruct rte_mem_config *mem_config;\n } __rte_packed;\n \n+\n /**\n  * Get the global configuration structure.\n  *\ndiff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build\nindex 3108442697..a16f002a3e 100644\n--- a/lib/librte_eal/common/meson.build\n+++ b/lib/librte_eal/common/meson.build\n@@ -7,6 +7,7 @@ if is_windows\n \tsources += files(\n \t\t'eal_common_bus.c',\n \t\t'eal_common_class.c',\n+\t\t'eal_common_config.c',\n \t\t'eal_common_devargs.c',\n \t\t'eal_common_dynmem.c',\n \t\t'eal_common_errno.c',\n@@ -34,6 +35,7 @@ sources += files(\n \t'eal_common_bus.c',\n \t'eal_common_cpuflags.c',\n \t'eal_common_class.c',\n+\t'eal_common_config.c',\n \t'eal_common_devargs.c',\n \t'eal_common_dev.c',\n \t'eal_common_errno.c',\ndiff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile\nindex 2374ba0b7d..7762b3ede4 100644\n--- a/lib/librte_eal/freebsd/Makefile\n+++ b/lib/librte_eal/freebsd/Makefile\n@@ -38,6 +38,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_alarm.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_dev.c\n \n # from common dir\n+SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_config.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_lcore.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_timer.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_memzone.c\ndiff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c\nindex c41f265fac..8d7b693a3b 100644\n--- a/lib/librte_eal/freebsd/eal.c\n+++ b/lib/librte_eal/freebsd/eal.c\n@@ -56,11 +56,6 @@\n \n #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL)\n \n-/* Allow the application to print its usage message too if set */\n-static rte_usage_hook_t\trte_application_usage_hook = NULL;\n-/* early configuration structure, when memory config is not mmapped */\n-static struct rte_mem_config early_mem_config;\n-\n /* define fd variable here, because file needs to be kept open for the\n  * duration of the program, as we hold a write lock on it in the primary proc */\n static int mem_cfg_fd = -1;\n@@ -69,26 +64,15 @@ static struct flock wr_lock = {\n \t\t.l_type = F_WRLCK,\n \t\t.l_whence = SEEK_SET,\n \t\t.l_start = offsetof(struct rte_mem_config, memsegs),\n-\t\t.l_len = sizeof(early_mem_config.memsegs),\n-};\n-\n-/* Address of global and public configuration */\n-static struct rte_config rte_config = {\n-\t\t.mem_config = &early_mem_config,\n+\t\t.l_len = RTE_SIZEOF_FIELD(struct rte_mem_config, memsegs),\n };\n \n /* internal configuration (per-core) */\n struct lcore_config lcore_config[RTE_MAX_LCORE];\n \n-/* internal configuration */\n-struct internal_config internal_config;\n-\n /* used by rte_rdtsc() */\n int rte_cycles_vmware_tsc_map;\n \n-/* platform-specific runtime dir */\n-static char runtime_dir[PATH_MAX];\n-\n static const char *default_runtime_dir = \"/var/run\";\n \n int\n@@ -97,6 +81,7 @@ eal_create_runtime_dir(void)\n \tconst char *directory = default_runtime_dir;\n \tconst char *xdg_runtime_dir = getenv(\"XDG_RUNTIME_DIR\");\n \tconst char *fallback = \"/tmp\";\n+\tchar run_dir[PATH_MAX];\n \tchar tmp[PATH_MAX];\n \tint ret;\n \n@@ -115,9 +100,9 @@ eal_create_runtime_dir(void)\n \t}\n \n \t/* create prefix-specific subdirectory under DPDK runtime dir */\n-\tret = snprintf(runtime_dir, sizeof(runtime_dir), \"%s/%s\",\n+\tret = snprintf(run_dir, sizeof(run_dir), \"%s/%s\",\n \t\t\ttmp, eal_get_hugefile_prefix());\n-\tif (ret < 0 || ret == sizeof(runtime_dir)) {\n+\tif (ret < 0 || ret == sizeof(run_dir)) {\n \t\tRTE_LOG(ERR, EAL, \"Error creating prefix-specific runtime path name\\n\");\n \t\treturn -1;\n \t}\n@@ -132,13 +117,15 @@ eal_create_runtime_dir(void)\n \t\treturn -1;\n \t}\n \n-\tret = mkdir(runtime_dir, 0700);\n+\tret = mkdir(run_dir, 0700);\n \tif (ret < 0 && errno != EEXIST) {\n \t\tRTE_LOG(ERR, EAL, \"Error creating '%s': %s\\n\",\n-\t\t\truntime_dir, strerror(errno));\n+\t\t\trun_dir, strerror(errno));\n \t\treturn -1;\n \t}\n \n+\trte_eal_set_runtime_dir(run_dir, sizeof(run_dir));\n+\n \treturn 0;\n }\n \n@@ -151,33 +138,6 @@ eal_clean_runtime_dir(void)\n \treturn 0;\n }\n \n-\n-const char *\n-rte_eal_get_runtime_dir(void)\n-{\n-\treturn runtime_dir;\n-}\n-\n-/* Return user provided mbuf pool ops name */\n-const char *\n-rte_eal_mbuf_user_pool_ops(void)\n-{\n-\treturn internal_config.user_mbuf_pool_ops_name;\n-}\n-\n-/* Return a pointer to the configuration structure */\n-struct rte_config *\n-rte_eal_get_configuration(void)\n-{\n-\treturn &rte_config;\n-}\n-\n-enum rte_iova_mode\n-rte_eal_iova_mode(void)\n-{\n-\treturn rte_eal_get_configuration()->iova_mode;\n-}\n-\n /* parse a sysfs (or other) file containing one integer value */\n int\n eal_parse_sysfs_value(const char *filename, unsigned long *val)\n@@ -219,21 +179,24 @@ eal_parse_sysfs_value(const char *filename, unsigned long *val)\n static int\n rte_eal_config_create(void)\n {\n+\tstruct rte_config *config = rte_eal_get_configuration();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \tsize_t page_sz = sysconf(_SC_PAGE_SIZE);\n-\tsize_t cfg_len = sizeof(*rte_config.mem_config);\n+\tsize_t cfg_len = sizeof(*config->mem_config);\n \tsize_t cfg_len_aligned = RTE_ALIGN(cfg_len, page_sz);\n \tvoid *rte_mem_cfg_addr, *mapped_mem_cfg_addr;\n \tint retval;\n \n \tconst char *pathname = eal_runtime_config_path();\n \n-\tif (internal_config.no_shconf)\n+\tif (internal_conf->no_shconf)\n \t\treturn 0;\n \n \t/* map the config before base address so that we don't waste a page */\n-\tif (internal_config.base_virtaddr != 0)\n+\tif (internal_conf->base_virtaddr != 0)\n \t\trte_mem_cfg_addr = (void *)\n-\t\t\tRTE_ALIGN_FLOOR(internal_config.base_virtaddr -\n+\t\t\tRTE_ALIGN_FLOOR(internal_conf->base_virtaddr -\n \t\t\tsizeof(struct rte_mem_config), page_sz);\n \telse\n \t\trte_mem_cfg_addr = NULL;\n@@ -287,13 +250,7 @@ rte_eal_config_create(void)\n \t\treturn -1;\n \t}\n \n-\tmemcpy(rte_mem_cfg_addr, &early_mem_config, sizeof(early_mem_config));\n-\trte_config.mem_config = rte_mem_cfg_addr;\n-\n-\t/* store address of the config in the config itself so that secondary\n-\t * processes could later map the config into this exact location\n-\t */\n-\trte_config.mem_config->mem_cfg_addr = (uintptr_t) rte_mem_cfg_addr;\n+\trte_eal_config_remap(rte_mem_cfg_addr);\n \n \treturn 0;\n }\n@@ -304,8 +261,12 @@ rte_eal_config_attach(void)\n {\n \tvoid *rte_mem_cfg_addr;\n \tconst char *pathname = eal_runtime_config_path();\n+\tstruct rte_config *config = rte_eal_get_configuration();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n-\tif (internal_config.no_shconf)\n+\n+\tif (internal_conf->no_shconf)\n \t\treturn 0;\n \n \tif (mem_cfg_fd < 0){\n@@ -317,7 +278,7 @@ rte_eal_config_attach(void)\n \t\t}\n \t}\n \n-\trte_mem_cfg_addr = mmap(NULL, sizeof(*rte_config.mem_config),\n+\trte_mem_cfg_addr = mmap(NULL, sizeof(*config->mem_config),\n \t\t\t\tPROT_READ, MAP_SHARED, mem_cfg_fd, 0);\n \t/* don't close the fd here, it will be closed on reattach */\n \tif (rte_mem_cfg_addr == MAP_FAILED) {\n@@ -328,7 +289,7 @@ rte_eal_config_attach(void)\n \t\treturn -1;\n \t}\n \n-\trte_config.mem_config = rte_mem_cfg_addr;\n+\tconfig->mem_config = rte_mem_cfg_addr;\n \n \treturn 0;\n }\n@@ -339,16 +300,19 @@ rte_eal_config_reattach(void)\n {\n \tstruct rte_mem_config *mem_config;\n \tvoid *rte_mem_cfg_addr;\n+\tstruct rte_config *config = rte_eal_get_configuration();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n-\tif (internal_config.no_shconf)\n+\tif (internal_conf->no_shconf)\n \t\treturn 0;\n \n \t/* save the address primary process has mapped shared config to */\n \trte_mem_cfg_addr =\n-\t\t\t(void *)(uintptr_t)rte_config.mem_config->mem_cfg_addr;\n+\t\t\t(void *)(uintptr_t)config->mem_config->mem_cfg_addr;\n \n \t/* unmap original config */\n-\tmunmap(rte_config.mem_config, sizeof(struct rte_mem_config));\n+\tmunmap(config->mem_config, sizeof(struct rte_mem_config));\n \n \t/* remap the config at proper address */\n \tmem_config = (struct rte_mem_config *) mmap(rte_mem_cfg_addr,\n@@ -372,7 +336,7 @@ rte_eal_config_reattach(void)\n \t\treturn -1;\n \t}\n \n-\trte_config.mem_config = mem_config;\n+\tconfig->mem_config = mem_config;\n \n \treturn 0;\n }\n@@ -383,9 +347,11 @@ eal_proc_type_detect(void)\n {\n \tenum rte_proc_type_t ptype = RTE_PROC_PRIMARY;\n \tconst char *pathname = eal_runtime_config_path();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n \t/* if there no shared config, there can be no secondary processes */\n-\tif (!internal_config.no_shconf) {\n+\tif (!internal_conf->no_shconf) {\n \t\t/* if we can open the file but not get a write-lock we are a\n \t\t * secondary process. NOTE: if we get a file handle back, we\n \t\t * keep that open and don't close it to prevent a race condition\n@@ -406,9 +372,13 @@ eal_proc_type_detect(void)\n static int\n rte_config_init(void)\n {\n-\trte_config.process_type = internal_config.process_type;\n+\tstruct rte_config *config = rte_eal_get_configuration();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n+\n+\tconfig->process_type = internal_conf->process_type;\n \n-\tswitch (rte_config.process_type){\n+\tswitch (config->process_type) {\n \tcase RTE_PROC_PRIMARY:\n \t\tif (rte_eal_config_create() < 0)\n \t\t\treturn -1;\n@@ -429,7 +399,7 @@ rte_config_init(void)\n \tcase RTE_PROC_AUTO:\n \tcase RTE_PROC_INVALID:\n \t\tRTE_LOG(ERR, EAL, \"Invalid process type %d\\n\",\n-\t\t\trte_config.process_type);\n+\t\t\tconfig->process_type);\n \t\treturn -1;\n \t}\n \n@@ -440,46 +410,17 @@ rte_config_init(void)\n static void\n eal_usage(const char *prgname)\n {\n+\trte_usage_hook_t *hook = rte_eal_get_application_usage_hook();\n+\n \tprintf(\"\\nUsage: %s \", prgname);\n \teal_common_usage();\n \t/* Allow the application to print its usage message too if hook is set */\n-\tif ( rte_application_usage_hook ) {\n+\tif (*hook) {\n \t\tprintf(\"===== Application Usage =====\\n\\n\");\n-\t\trte_application_usage_hook(prgname);\n+\t\t(*hook)(prgname);\n \t}\n }\n \n-/* Set a per-application usage message */\n-rte_usage_hook_t\n-rte_set_application_usage_hook( rte_usage_hook_t usage_func )\n-{\n-\trte_usage_hook_t\told_func;\n-\n-\t/* Will be NULL on the first call to denote the last usage routine. */\n-\told_func\t\t\t\t\t= rte_application_usage_hook;\n-\trte_application_usage_hook\t= usage_func;\n-\n-\treturn old_func;\n-}\n-\n-static inline size_t\n-eal_get_hugepage_mem_size(void)\n-{\n-\tuint64_t size = 0;\n-\tunsigned i, j;\n-\n-\tfor (i = 0; i < internal_config.num_hugepage_sizes; i++) {\n-\t\tstruct hugepage_info *hpi = &internal_config.hugepage_info[i];\n-\t\tif (strnlen(hpi->hugedir, sizeof(hpi->hugedir)) != 0) {\n-\t\t\tfor (j = 0; j < RTE_MAX_NUMA_NODES; j++) {\n-\t\t\t\tsize += hpi->hugepage_sz * hpi->num_pages[j];\n-\t\t\t}\n-\t\t}\n-\t}\n-\n-\treturn (size < SIZE_MAX) ? (size_t)(size) : SIZE_MAX;\n-}\n-\n /* Parse the arguments for --log-level only */\n static void\n eal_log_level_parse(int argc, char **argv)\n@@ -491,6 +432,8 @@ eal_log_level_parse(int argc, char **argv)\n \tconst int old_optopt = optopt;\n \tconst int old_optreset = optreset;\n \tchar * const old_optarg = optarg;\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \targvopt = argv;\n \toptind = 1;\n@@ -506,7 +449,7 @@ eal_log_level_parse(int argc, char **argv)\n \t\t\tbreak;\n \n \t\tret = (opt == OPT_LOG_LEVEL_NUM) ?\n-\t\t\teal_parse_common_option(opt, optarg, &internal_config) : 0;\n+\t\t    eal_parse_common_option(opt, optarg, internal_conf) : 0;\n \n \t\t/* common parser is not happy */\n \t\tif (ret < 0)\n@@ -532,6 +475,8 @@ eal_parse_args(int argc, char **argv)\n \tconst int old_optopt = optopt;\n \tconst int old_optreset = optreset;\n \tchar * const old_optarg = optarg;\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \targvopt = argv;\n \toptind = 1;\n@@ -547,7 +492,7 @@ eal_parse_args(int argc, char **argv)\n \t\t\tgoto out;\n \t\t}\n \n-\t\tret = eal_parse_common_option(opt, optarg, &internal_config);\n+\t\tret = eal_parse_common_option(opt, optarg, internal_conf);\n \t\t/* common parser is not happy */\n \t\tif (ret < 0) {\n \t\t\teal_usage(prgname);\n@@ -566,11 +511,11 @@ eal_parse_args(int argc, char **argv)\n \t\t\t\tRTE_LOG(ERR, EAL, \"Could not store mbuf pool ops name\\n\");\n \t\t\telse {\n \t\t\t\t/* free old ops name */\n-\t\t\t\tif (internal_config.user_mbuf_pool_ops_name !=\n+\t\t\t\tif (internal_conf->user_mbuf_pool_ops_name !=\n \t\t\t\t\t\tNULL)\n-\t\t\t\t\tfree(internal_config.user_mbuf_pool_ops_name);\n+\t\t\t\t\tfree(internal_conf->user_mbuf_pool_ops_name);\n \n-\t\t\t\tinternal_config.user_mbuf_pool_ops_name =\n+\t\t\t\tinternal_conf->user_mbuf_pool_ops_name =\n \t\t\t\t\t\tops_name;\n \t\t\t}\n \t\t\tbreak;\n@@ -598,20 +543,20 @@ eal_parse_args(int argc, char **argv)\n \t}\n \n \t/* create runtime data directory */\n-\tif (internal_config.no_shconf == 0 &&\n+\tif (internal_conf->no_shconf == 0 &&\n \t\t\teal_create_runtime_dir() < 0) {\n \t\tRTE_LOG(ERR, EAL, \"Cannot create runtime directory\\n\");\n \t\tret = -1;\n \t\tgoto out;\n \t}\n \n-\tif (eal_adjust_config(&internal_config) != 0) {\n+\tif (eal_adjust_config(internal_conf) != 0) {\n \t\tret = -1;\n \t\tgoto out;\n \t}\n \n \t/* sanity checks */\n-\tif (eal_check_common_options(&internal_config) != 0) {\n+\tif (eal_check_common_options(internal_conf) != 0) {\n \t\teal_usage(prgname);\n \t\tret = -1;\n \t\tgoto out;\n@@ -649,8 +594,9 @@ static void\n eal_check_mem_on_local_socket(void)\n {\n \tint socket_id;\n+\tconst struct rte_config *config = rte_eal_get_configuration();\n \n-\tsocket_id = rte_lcore_to_socket_id(rte_config.master_lcore);\n+\tsocket_id = rte_lcore_to_socket_id(config->master_lcore);\n \n \tif (rte_memseg_list_walk(check_socket, &socket_id) == 0)\n \t\tRTE_LOG(WARNING, EAL, \"WARNING: Master core has no memory on local socket!\\n\");\n@@ -662,13 +608,6 @@ sync_func(__rte_unused void *arg)\n {\n \treturn 0;\n }\n-\n-/* return non-zero if hugepages are enabled. */\n-int rte_eal_has_hugepages(void)\n-{\n-\treturn !internal_config.no_hugetlbfs;\n-}\n-\n /* Abstraction for port I/0 privilege */\n int\n rte_eal_iopl_init(void)\n@@ -699,6 +638,9 @@ rte_eal_init(int argc, char **argv)\n \tstatic rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0);\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n \tchar thread_name[RTE_MAX_THREAD_NAME_LEN];\n+\tconst struct rte_config *config = rte_eal_get_configuration();\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \t/* checks if the machine is adequate */\n \tif (!rte_cpu_is_supported()) {\n@@ -715,7 +657,7 @@ rte_eal_init(int argc, char **argv)\n \n \tthread_id = pthread_self();\n \n-\teal_reset_internal_config(&internal_config);\n+\teal_reset_internal_config(internal_conf);\n \n \t/* clone argv to report out later in telemetry */\n \teal_save_args(argc, argv);\n@@ -738,7 +680,7 @@ rte_eal_init(int argc, char **argv)\n \t}\n \n \t/* FreeBSD always uses legacy memory model */\n-\tinternal_config.legacy_mem = true;\n+\tinternal_conf->legacy_mem = true;\n \n \tif (eal_plugins_init() < 0) {\n \t\trte_eal_init_alert(\"Cannot init plugins\");\n@@ -795,7 +737,7 @@ rte_eal_init(int argc, char **argv)\n \t}\n \n \t/* if no EAL option \"--iova-mode=<pa|va>\", use bus IOVA scheme */\n-\tif (internal_config.iova_mode == RTE_IOVA_DC) {\n+\tif (internal_conf->iova_mode == RTE_IOVA_DC) {\n \t\t/* autodetect the IOVA mapping mode (default is RTE_IOVA_PA) */\n \t\tenum rte_iova_mode iova_mode = rte_bus_get_iommu_class();\n \n@@ -804,15 +746,15 @@ rte_eal_init(int argc, char **argv)\n \t\trte_eal_get_configuration()->iova_mode = iova_mode;\n \t} else {\n \t\trte_eal_get_configuration()->iova_mode =\n-\t\t\tinternal_config.iova_mode;\n+\t\t\tinternal_conf->iova_mode;\n \t}\n \n \tRTE_LOG(INFO, EAL, \"Selected IOVA mode '%s'\\n\",\n \t\trte_eal_iova_mode() == RTE_IOVA_PA ? \"PA\" : \"VA\");\n \n-\tif (internal_config.no_hugetlbfs == 0) {\n+\tif (internal_conf->no_hugetlbfs == 0) {\n \t\t/* rte_config isn't initialized yet */\n-\t\tret = internal_config.process_type == RTE_PROC_PRIMARY ?\n+\t\tret = internal_conf->process_type == RTE_PROC_PRIMARY ?\n \t\t\teal_hugepage_info_init() :\n \t\t\teal_hugepage_info_read();\n \t\tif (ret < 0) {\n@@ -823,14 +765,14 @@ rte_eal_init(int argc, char **argv)\n \t\t}\n \t}\n \n-\tif (internal_config.memory == 0 && internal_config.force_sockets == 0) {\n-\t\tif (internal_config.no_hugetlbfs)\n-\t\t\tinternal_config.memory = MEMSIZE_IF_NO_HUGE_PAGE;\n+\tif (internal_conf->memory == 0 && internal_conf->force_sockets == 0) {\n+\t\tif (internal_conf->no_hugetlbfs)\n+\t\t\tinternal_conf->memory = MEMSIZE_IF_NO_HUGE_PAGE;\n \t\telse\n-\t\t\tinternal_config.memory = eal_get_hugepage_mem_size();\n+\t\t\tinternal_conf->memory = eal_get_hugepage_mem_size();\n \t}\n \n-\tif (internal_config.vmware_tsc_map == 1) {\n+\tif (internal_conf->vmware_tsc_map == 1) {\n #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT\n \t\trte_cycles_vmware_tsc_map = 1;\n \t\tRTE_LOG (DEBUG, EAL, \"Using VMWARE TSC MAP, \"\n@@ -877,12 +819,12 @@ rte_eal_init(int argc, char **argv)\n \n \teal_check_mem_on_local_socket();\n \n-\teal_thread_init_master(rte_config.master_lcore);\n+\teal_thread_init_master(config->master_lcore);\n \n \tret = eal_thread_dump_affinity(cpuset, sizeof(cpuset));\n \n \tRTE_LOG(DEBUG, EAL, \"Master lcore %u is ready (tid=%p;cpuset=[%s%s])\\n\",\n-\t\trte_config.master_lcore, thread_id, cpuset,\n+\t\tconfig->master_lcore, thread_id, cpuset,\n \t\tret == 0 ? \"\" : \"...\");\n \n \tRTE_LCORE_FOREACH_SLAVE(i) {\n@@ -951,14 +893,14 @@ rte_eal_init(int argc, char **argv)\n \t * In no_shconf mode, no runtime directory is created in the first\n \t * place, so no cleanup needed.\n \t */\n-\tif (!internal_config.no_shconf && eal_clean_runtime_dir() < 0) {\n+\tif (!internal_conf->no_shconf && eal_clean_runtime_dir() < 0) {\n \t\trte_eal_init_alert(\"Cannot clear runtime directory\\n\");\n \t\treturn -1;\n \t}\n-\tif (!internal_config.no_telemetry) {\n+\tif (!internal_conf->no_telemetry) {\n \t\tconst char *error_str = NULL;\n \t\tif (rte_telemetry_init(rte_eal_get_runtime_dir(),\n-\t\t\t\t&internal_config.ctrl_cpuset, &error_str)\n+\t\t\t\t&internal_conf->ctrl_cpuset, &error_str)\n \t\t\t\t!= 0) {\n \t\t\trte_eal_init_alert(error_str);\n \t\t\treturn -1;\n@@ -975,28 +917,21 @@ rte_eal_init(int argc, char **argv)\n int\n rte_eal_cleanup(void)\n {\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \trte_service_finalize();\n \trte_mp_channel_cleanup();\n \trte_trace_save();\n \teal_trace_fini();\n-\teal_cleanup_config(&internal_config);\n+\teal_cleanup_config(internal_conf);\n \treturn 0;\n }\n \n-enum rte_proc_type_t\n-rte_eal_process_type(void)\n-{\n-\treturn rte_config.process_type;\n-}\n-\n-int rte_eal_has_pci(void)\n-{\n-\treturn !internal_config.no_pci;\n-}\n-\n int rte_eal_create_uio_dev(void)\n {\n-\treturn internal_config.create_uio_dev;\n+\tconst struct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n+\treturn internal_conf->create_uio_dev;\n }\n \n enum rte_intr_mode\ndiff --git a/lib/librte_eal/include/rte_eal.h b/lib/librte_eal/include/rte_eal.h\nindex 2f9ed298de..f259ae688f 100644\n--- a/lib/librte_eal/include/rte_eal.h\n+++ b/lib/librte_eal/include/rte_eal.h\n@@ -488,6 +488,19 @@ rte_eal_mbuf_user_pool_ops(void);\n const char *\n rte_eal_get_runtime_dir(void);\n \n+void\n+rte_eal_set_runtime_dir(char *run_dir, size_t size);\n+\n+void\n+rte_eal_config_remap(void *mem_cfg_addr);\n+\n+struct internal_config *\n+rte_eal_get_internal_configuration(void);\n+\n+rte_usage_hook_t *\n+rte_eal_get_application_usage_hook(void);\n+\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile\nindex 07ce643bae..28404b0534 100644\n--- a/lib/librte_eal/linux/Makefile\n+++ b/lib/librte_eal/linux/Makefile\n@@ -45,6 +45,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_alarm.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_dev.c\n \n # from common dir\n+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_config.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_lcore.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_timer.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_memzone.c\ndiff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c\nindex f162124a37..643e8f4285 100644\n--- a/lib/librte_eal/linux/eal.c\n+++ b/lib/librte_eal/linux/eal.c\n@@ -69,12 +69,6 @@\n \n #define KERNEL_IOMMU_GROUPS_PATH \"/sys/kernel/iommu_groups\"\n \n-/* Allow the application to print its usage message too if set */\n-static rte_usage_hook_t\trte_application_usage_hook = NULL;\n-\n-/* early configuration structure, when memory config is not mmapped */\n-static struct rte_mem_config early_mem_config;\n-\n /* define fd variable here, because file needs to be kept open for the\n  * duration of the program, as we hold a write lock on it in the primary proc */\n static int mem_cfg_fd = -1;\n@@ -83,26 +77,15 @@ static struct flock wr_lock = {\n \t\t.l_type = F_WRLCK,\n \t\t.l_whence = SEEK_SET,\n \t\t.l_start = offsetof(struct rte_mem_config, memsegs),\n-\t\t.l_len = sizeof(early_mem_config.memsegs),\n-};\n-\n-/* Address of global and public configuration */\n-static struct rte_config rte_config = {\n-\t\t.mem_config = &early_mem_config,\n+\t\t.l_len = RTE_SIZEOF_FIELD(struct rte_mem_config, memsegs),\n };\n \n /* internal configuration (per-core) */\n struct lcore_config lcore_config[RTE_MAX_LCORE];\n \n-/* internal configuration */\n-struct internal_config internal_config;\n-\n /* used by rte_rdtsc() */\n int rte_cycles_vmware_tsc_map;\n \n-/* platform-specific runtime dir */\n-static char runtime_dir[PATH_MAX];\n-\n static const char *default_runtime_dir = \"/var/run\";\n \n int\n@@ -111,6 +94,7 @@ eal_create_runtime_dir(void)\n \tconst char *directory = default_runtime_dir;\n \tconst char *xdg_runtime_dir = getenv(\"XDG_RUNTIME_DIR\");\n \tconst char *fallback = \"/tmp\";\n+\tchar run_dir[PATH_MAX];\n \tchar tmp[PATH_MAX];\n \tint ret;\n \n@@ -129,9 +113,9 @@ eal_create_runtime_dir(void)\n \t}\n \n \t/* create prefix-specific subdirectory under DPDK runtime dir */\n-\tret = snprintf(runtime_dir, sizeof(runtime_dir), \"%s/%s\",\n+\tret = snprintf(run_dir, sizeof(run_dir), \"%s/%s\",\n \t\t\ttmp, eal_get_hugefile_prefix());\n-\tif (ret < 0 || ret == sizeof(runtime_dir)) {\n+\tif (ret < 0 || ret == sizeof(run_dir)) {\n \t\tRTE_LOG(ERR, EAL, \"Error creating prefix-specific runtime path name\\n\");\n \t\treturn -1;\n \t}\n@@ -146,19 +130,22 @@ eal_create_runtime_dir(void)\n \t\treturn -1;\n \t}\n \n-\tret = mkdir(runtime_dir, 0700);\n+\tret = mkdir(run_dir, 0700);\n \tif (ret < 0 && errno != EEXIST) {\n \t\tRTE_LOG(ERR, EAL, \"Error creating '%s': %s\\n\",\n-\t\t\truntime_dir, strerror(errno));\n+\t\t\trun_dir, strerror(errno));\n \t\treturn -1;\n \t}\n \n+\trte_eal_set_runtime_dir(run_dir, sizeof(run_dir));\n+\n \treturn 0;\n }\n \n int\n eal_clean_runtime_dir(void)\n {\n+\tconst char *runtime_dir = rte_eal_get_runtime_dir();\n \tDIR *dir;\n \tstruct dirent *dirent;\n \tint dir_fd, fd, lck_result;\n@@ -241,32 +228,6 @@ eal_clean_runtime_dir(void)\n \treturn -1;\n }\n \n-const char *\n-rte_eal_get_runtime_dir(void)\n-{\n-\treturn runtime_dir;\n-}\n-\n-/* Return user provided mbuf pool ops name */\n-const char *\n-rte_eal_mbuf_user_pool_ops(void)\n-{\n-\treturn internal_config.user_mbuf_pool_ops_name;\n-}\n-\n-/* Return a pointer to the configuration structure */\n-struct rte_config *\n-rte_eal_get_configuration(void)\n-{\n-\treturn &rte_config;\n-}\n-\n-enum rte_iova_mode\n-rte_eal_iova_mode(void)\n-{\n-\treturn rte_eal_get_configuration()->iova_mode;\n-}\n-\n /* parse a sysfs (or other) file containing one integer value */\n int\n eal_parse_sysfs_value(const char *filename, unsigned long *val)\n@@ -308,21 +269,24 @@ eal_parse_sysfs_value(const char *filename, unsigned long *val)\n static int\n rte_eal_config_create(void)\n {\n+\tstruct rte_config *config = rte_eal_get_configuration();\n \tsize_t page_sz = sysconf(_SC_PAGE_SIZE);\n-\tsize_t cfg_len = sizeof(*rte_config.mem_config);\n+\tsize_t cfg_len = sizeof(*config->mem_config);\n \tsize_t cfg_len_aligned = RTE_ALIGN(cfg_len, page_sz);\n \tvoid *rte_mem_cfg_addr, *mapped_mem_cfg_addr;\n \tint retval;\n+\tconst struct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \tconst char *pathname = eal_runtime_config_path();\n \n-\tif (internal_config.no_shconf)\n+\tif (internal_conf->no_shconf)\n \t\treturn 0;\n \n \t/* map the config before hugepage address so that we don't waste a page */\n-\tif (internal_config.base_virtaddr != 0)\n+\tif (internal_conf->base_virtaddr != 0)\n \t\trte_mem_cfg_addr = (void *)\n-\t\t\tRTE_ALIGN_FLOOR(internal_config.base_virtaddr -\n+\t\t\tRTE_ALIGN_FLOOR(internal_conf->base_virtaddr -\n \t\t\tsizeof(struct rte_mem_config), page_sz);\n \telse\n \t\trte_mem_cfg_addr = NULL;\n@@ -376,14 +340,7 @@ rte_eal_config_create(void)\n \t\treturn -1;\n \t}\n \n-\tmemcpy(rte_mem_cfg_addr, &early_mem_config, sizeof(early_mem_config));\n-\trte_config.mem_config = rte_mem_cfg_addr;\n-\n-\t/* store address of the config in the config itself so that secondary\n-\t * processes could later map the config into this exact location */\n-\trte_config.mem_config->mem_cfg_addr = (uintptr_t) rte_mem_cfg_addr;\n-\n-\trte_config.mem_config->dma_maskbits = 0;\n+\trte_eal_config_remap(rte_mem_cfg_addr);\n \n \treturn 0;\n }\n@@ -392,11 +349,14 @@ rte_eal_config_create(void)\n static int\n rte_eal_config_attach(void)\n {\n+\tstruct rte_config *config = rte_eal_get_configuration();\n \tstruct rte_mem_config *mem_config;\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n \tconst char *pathname = eal_runtime_config_path();\n \n-\tif (internal_config.no_shconf)\n+\tif (internal_conf->no_shconf)\n \t\treturn 0;\n \n \tif (mem_cfg_fd < 0){\n@@ -419,7 +379,7 @@ rte_eal_config_attach(void)\n \t\treturn -1;\n \t}\n \n-\trte_config.mem_config = mem_config;\n+\tconfig->mem_config = mem_config;\n \n \treturn 0;\n }\n@@ -428,17 +388,20 @@ rte_eal_config_attach(void)\n static int\n rte_eal_config_reattach(void)\n {\n+\tstruct rte_config *config = rte_eal_get_configuration();\n \tstruct rte_mem_config *mem_config;\n \tvoid *rte_mem_cfg_addr;\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n-\tif (internal_config.no_shconf)\n+\tif (internal_conf->no_shconf)\n \t\treturn 0;\n \n \t/* save the address primary process has mapped shared config to */\n-\trte_mem_cfg_addr = (void *) (uintptr_t) rte_config.mem_config->mem_cfg_addr;\n+\trte_mem_cfg_addr = (void *) (uintptr_t) config->mem_config->mem_cfg_addr;\n \n \t/* unmap original config */\n-\tmunmap(rte_config.mem_config, sizeof(struct rte_mem_config));\n+\tmunmap(config->mem_config, sizeof(struct rte_mem_config));\n \n \t/* remap the config at proper address */\n \tmem_config = (struct rte_mem_config *) mmap(rte_mem_cfg_addr,\n@@ -462,7 +425,7 @@ rte_eal_config_reattach(void)\n \t\treturn -1;\n \t}\n \n-\trte_config.mem_config = mem_config;\n+\tconfig->mem_config = mem_config;\n \n \treturn 0;\n }\n@@ -473,9 +436,11 @@ eal_proc_type_detect(void)\n {\n \tenum rte_proc_type_t ptype = RTE_PROC_PRIMARY;\n \tconst char *pathname = eal_runtime_config_path();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n \t/* if there no shared config, there can be no secondary processes */\n-\tif (!internal_config.no_shconf) {\n+\tif (!internal_conf->no_shconf) {\n \t\t/* if we can open the file but not get a write-lock we are a\n \t\t * secondary process. NOTE: if we get a file handle back, we\n \t\t * keep that open and don't close it to prevent a race condition\n@@ -496,9 +461,13 @@ eal_proc_type_detect(void)\n static int\n rte_config_init(void)\n {\n-\trte_config.process_type = internal_config.process_type;\n+\tstruct rte_config *config = rte_eal_get_configuration();\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \n-\tswitch (rte_config.process_type){\n+\tconfig->process_type = internal_conf->process_type;\n+\n+\tswitch (config->process_type) {\n \tcase RTE_PROC_PRIMARY:\n \t\tif (rte_eal_config_create() < 0)\n \t\t\treturn -1;\n@@ -519,7 +488,7 @@ rte_config_init(void)\n \tcase RTE_PROC_AUTO:\n \tcase RTE_PROC_INVALID:\n \t\tRTE_LOG(ERR, EAL, \"Invalid process type %d\\n\",\n-\t\t\trte_config.process_type);\n+\t\t\tconfig->process_type);\n \t\treturn -1;\n \t}\n \n@@ -531,17 +500,19 @@ static void\n eal_hugedirs_unlock(void)\n {\n \tint i;\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \tfor (i = 0; i < MAX_HUGEPAGE_SIZES; i++)\n \t{\n \t\t/* skip uninitialized */\n-\t\tif (internal_config.hugepage_info[i].lock_descriptor < 0)\n+\t\tif (internal_conf->hugepage_info[i].lock_descriptor < 0)\n \t\t\tcontinue;\n \t\t/* unlock hugepage file */\n-\t\tflock(internal_config.hugepage_info[i].lock_descriptor, LOCK_UN);\n-\t\tclose(internal_config.hugepage_info[i].lock_descriptor);\n+\t\tflock(internal_conf->hugepage_info[i].lock_descriptor, LOCK_UN);\n+\t\tclose(internal_conf->hugepage_info[i].lock_descriptor);\n \t\t/* reset the field */\n-\t\tinternal_config.hugepage_info[i].lock_descriptor = -1;\n+\t\tinternal_conf->hugepage_info[i].lock_descriptor = -1;\n \t}\n }\n \n@@ -549,6 +520,8 @@ eal_hugedirs_unlock(void)\n static void\n eal_usage(const char *prgname)\n {\n+\trte_usage_hook_t *hook = rte_eal_get_application_usage_hook();\n+\n \tprintf(\"\\nUsage: %s \", prgname);\n \teal_common_usage();\n \tprintf(\"EAL Linux options:\\n\"\n@@ -563,25 +536,12 @@ eal_usage(const char *prgname)\n \t       \"  --\"OPT_MATCH_ALLOCATIONS\" Free hugepages exactly as allocated\\n\"\n \t       \"\\n\");\n \t/* Allow the application to print its usage message too if hook is set */\n-\tif ( rte_application_usage_hook ) {\n+\tif (*hook) {\n \t\tprintf(\"===== Application Usage =====\\n\\n\");\n-\t\trte_application_usage_hook(prgname);\n+\t\t(*hook)(prgname);\n \t}\n }\n \n-/* Set a per-application usage message */\n-rte_usage_hook_t\n-rte_set_application_usage_hook( rte_usage_hook_t usage_func )\n-{\n-\trte_usage_hook_t\told_func;\n-\n-\t/* Will be NULL on the first call to denote the last usage routine. */\n-\told_func\t\t\t\t\t= rte_application_usage_hook;\n-\trte_application_usage_hook\t= usage_func;\n-\n-\treturn old_func;\n-}\n-\n static int\n eal_parse_socket_arg(char *strval, volatile uint64_t *socket_arg)\n {\n@@ -630,6 +590,8 @@ eal_parse_socket_arg(char *strval, volatile uint64_t *socket_arg)\n static int\n eal_parse_vfio_intr(const char *mode)\n {\n+\tstruct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n \tunsigned i;\n \tstatic struct {\n \t\tconst char *name;\n@@ -642,7 +604,7 @@ eal_parse_vfio_intr(const char *mode)\n \n \tfor (i = 0; i < RTE_DIM(map); i++) {\n \t\tif (!strcmp(mode, map[i].name)) {\n-\t\t\tinternal_config.vfio_intr_mode = map[i].value;\n+\t\t\tinternal_conf->vfio_intr_mode = map[i].value;\n \t\t\treturn 0;\n \t\t}\n \t}\n@@ -659,6 +621,8 @@ eal_log_level_parse(int argc, char **argv)\n \tconst int old_optind = optind;\n \tconst int old_optopt = optopt;\n \tchar * const old_optarg = optarg;\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \targvopt = argv;\n \toptind = 1;\n@@ -673,7 +637,7 @@ eal_log_level_parse(int argc, char **argv)\n \t\t\tbreak;\n \n \t\tret = (opt == OPT_LOG_LEVEL_NUM) ?\n-\t\t\teal_parse_common_option(opt, optarg, &internal_config) : 0;\n+\t\t\teal_parse_common_option(opt, optarg, internal_conf) : 0;\n \n \t\t/* common parser is not happy */\n \t\tif (ret < 0)\n@@ -697,6 +661,8 @@ eal_parse_args(int argc, char **argv)\n \tconst int old_optind = optind;\n \tconst int old_optopt = optopt;\n \tchar * const old_optarg = optarg;\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \targvopt = argv;\n \toptind = 1;\n@@ -711,7 +677,7 @@ eal_parse_args(int argc, char **argv)\n \t\t\tgoto out;\n \t\t}\n \n-\t\tret = eal_parse_common_option(opt, optarg, &internal_config);\n+\t\tret = eal_parse_common_option(opt, optarg, internal_conf);\n \t\t/* common parser is not happy */\n \t\tif (ret < 0) {\n \t\t\teal_usage(prgname);\n@@ -734,9 +700,9 @@ eal_parse_args(int argc, char **argv)\n \t\t\t\tRTE_LOG(ERR, EAL, \"Could not store hugepage directory\\n\");\n \t\t\telse {\n \t\t\t\t/* free old hugepage dir */\n-\t\t\t\tif (internal_config.hugepage_dir != NULL)\n-\t\t\t\t\tfree(internal_config.hugepage_dir);\n-\t\t\t\tinternal_config.hugepage_dir = hdir;\n+\t\t\t\tif (internal_conf->hugepage_dir != NULL)\n+\t\t\t\t\tfree(internal_conf->hugepage_dir);\n+\t\t\t\tinternal_conf->hugepage_dir = hdir;\n \t\t\t}\n \t\t\tbreak;\n \t\t}\n@@ -747,34 +713,34 @@ eal_parse_args(int argc, char **argv)\n \t\t\t\tRTE_LOG(ERR, EAL, \"Could not store file prefix\\n\");\n \t\t\telse {\n \t\t\t\t/* free old prefix */\n-\t\t\t\tif (internal_config.hugefile_prefix != NULL)\n-\t\t\t\t\tfree(internal_config.hugefile_prefix);\n-\t\t\t\tinternal_config.hugefile_prefix = prefix;\n+\t\t\t\tif (internal_conf->hugefile_prefix != NULL)\n+\t\t\t\t\tfree(internal_conf->hugefile_prefix);\n+\t\t\t\tinternal_conf->hugefile_prefix = prefix;\n \t\t\t}\n \t\t\tbreak;\n \t\t}\n \t\tcase OPT_SOCKET_MEM_NUM:\n \t\t\tif (eal_parse_socket_arg(optarg,\n-\t\t\t\t\tinternal_config.socket_mem) < 0) {\n+\t\t\t\t\tinternal_conf->socket_mem) < 0) {\n \t\t\t\tRTE_LOG(ERR, EAL, \"invalid parameters for --\"\n \t\t\t\t\t\tOPT_SOCKET_MEM \"\\n\");\n \t\t\t\teal_usage(prgname);\n \t\t\t\tret = -1;\n \t\t\t\tgoto out;\n \t\t\t}\n-\t\t\tinternal_config.force_sockets = 1;\n+\t\t\tinternal_conf->force_sockets = 1;\n \t\t\tbreak;\n \n \t\tcase OPT_SOCKET_LIMIT_NUM:\n \t\t\tif (eal_parse_socket_arg(optarg,\n-\t\t\t\t\tinternal_config.socket_limit) < 0) {\n+\t\t\t\t\tinternal_conf->socket_limit) < 0) {\n \t\t\t\tRTE_LOG(ERR, EAL, \"invalid parameters for --\"\n \t\t\t\t\t\tOPT_SOCKET_LIMIT \"\\n\");\n \t\t\t\teal_usage(prgname);\n \t\t\t\tret = -1;\n \t\t\t\tgoto out;\n \t\t\t}\n-\t\t\tinternal_config.force_socket_limits = 1;\n+\t\t\tinternal_conf->force_socket_limits = 1;\n \t\t\tbreak;\n \n \t\tcase OPT_VFIO_INTR_NUM:\n@@ -788,7 +754,7 @@ eal_parse_args(int argc, char **argv)\n \t\t\tbreak;\n \n \t\tcase OPT_CREATE_UIO_DEV_NUM:\n-\t\t\tinternal_config.create_uio_dev = 1;\n+\t\t\tinternal_conf->create_uio_dev = 1;\n \t\t\tbreak;\n \n \t\tcase OPT_MBUF_POOL_OPS_NAME_NUM:\n@@ -798,17 +764,17 @@ eal_parse_args(int argc, char **argv)\n \t\t\t\tRTE_LOG(ERR, EAL, \"Could not store mbuf pool ops name\\n\");\n \t\t\telse {\n \t\t\t\t/* free old ops name */\n-\t\t\t\tif (internal_config.user_mbuf_pool_ops_name !=\n+\t\t\t\tif (internal_conf->user_mbuf_pool_ops_name !=\n \t\t\t\t\t\tNULL)\n-\t\t\t\t\tfree(internal_config.user_mbuf_pool_ops_name);\n+\t\t\t\t\tfree(internal_conf->user_mbuf_pool_ops_name);\n \n-\t\t\t\tinternal_config.user_mbuf_pool_ops_name =\n+\t\t\t\tinternal_conf->user_mbuf_pool_ops_name =\n \t\t\t\t\t\tops_name;\n \t\t\t}\n \t\t\tbreak;\n \t\t}\n \t\tcase OPT_MATCH_ALLOCATIONS_NUM:\n-\t\t\tinternal_config.match_allocations = 1;\n+\t\t\tinternal_conf->match_allocations = 1;\n \t\t\tbreak;\n \n \t\tdefault:\n@@ -831,20 +797,20 @@ eal_parse_args(int argc, char **argv)\n \t}\n \n \t/* create runtime data directory */\n-\tif (internal_config.no_shconf == 0 &&\n+\tif (internal_conf->no_shconf == 0 &&\n \t\t\teal_create_runtime_dir() < 0) {\n \t\tRTE_LOG(ERR, EAL, \"Cannot create runtime directory\\n\");\n \t\tret = -1;\n \t\tgoto out;\n \t}\n \n-\tif (eal_adjust_config(&internal_config) != 0) {\n+\tif (eal_adjust_config(internal_conf) != 0) {\n \t\tret = -1;\n \t\tgoto out;\n \t}\n \n \t/* sanity checks */\n-\tif (eal_check_common_options(&internal_config) != 0) {\n+\tif (eal_check_common_options(internal_conf) != 0) {\n \t\teal_usage(prgname);\n \t\tret = -1;\n \t\tgoto out;\n@@ -878,8 +844,9 @@ static void\n eal_check_mem_on_local_socket(void)\n {\n \tint socket_id;\n+\tconst struct rte_config *config = rte_eal_get_configuration();\n \n-\tsocket_id = rte_lcore_to_socket_id(rte_config.master_lcore);\n+\tsocket_id = rte_lcore_to_socket_id(config->master_lcore);\n \n \tif (rte_memseg_list_walk(check_socket, &socket_id) == 0)\n \t\tRTE_LOG(WARNING, EAL, \"WARNING: Master core has no memory on local socket!\\n\");\n@@ -961,6 +928,9 @@ rte_eal_init(int argc, char **argv)\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n \tchar thread_name[RTE_MAX_THREAD_NAME_LEN];\n \tbool phys_addrs;\n+\tconst struct rte_config *config = rte_eal_get_configuration();\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \t/* checks if the machine is adequate */\n \tif (!rte_cpu_is_supported()) {\n@@ -979,7 +949,7 @@ rte_eal_init(int argc, char **argv)\n \tstrlcpy(logid, p ? p + 1 : argv[0], sizeof(logid));\n \tthread_id = pthread_self();\n \n-\teal_reset_internal_config(&internal_config);\n+\teal_reset_internal_config(internal_conf);\n \n \t/* set log level as early as possible */\n \teal_log_level_parse(argc, argv);\n@@ -1063,7 +1033,7 @@ rte_eal_init(int argc, char **argv)\n \tphys_addrs = rte_eal_using_phys_addrs() != 0;\n \n \t/* if no EAL option \"--iova-mode=<pa|va>\", use bus IOVA scheme */\n-\tif (internal_config.iova_mode == RTE_IOVA_DC) {\n+\tif (internal_conf->iova_mode == RTE_IOVA_DC) {\n \t\t/* autodetect the IOVA mapping mode */\n \t\tenum rte_iova_mode iova_mode = rte_bus_get_iommu_class();\n \n@@ -1110,7 +1080,7 @@ rte_eal_init(int argc, char **argv)\n \t\trte_eal_get_configuration()->iova_mode = iova_mode;\n \t} else {\n \t\trte_eal_get_configuration()->iova_mode =\n-\t\t\tinternal_config.iova_mode;\n+\t\t\tinternal_conf->iova_mode;\n \t}\n \n \tif (rte_eal_iova_mode() == RTE_IOVA_PA && !phys_addrs) {\n@@ -1122,9 +1092,9 @@ rte_eal_init(int argc, char **argv)\n \tRTE_LOG(INFO, EAL, \"Selected IOVA mode '%s'\\n\",\n \t\trte_eal_iova_mode() == RTE_IOVA_PA ? \"PA\" : \"VA\");\n \n-\tif (internal_config.no_hugetlbfs == 0) {\n+\tif (internal_conf->no_hugetlbfs == 0) {\n \t\t/* rte_config isn't initialized yet */\n-\t\tret = internal_config.process_type == RTE_PROC_PRIMARY ?\n+\t\tret = internal_conf->process_type == RTE_PROC_PRIMARY ?\n \t\t\t\teal_hugepage_info_init() :\n \t\t\t\teal_hugepage_info_read();\n \t\tif (ret < 0) {\n@@ -1135,12 +1105,12 @@ rte_eal_init(int argc, char **argv)\n \t\t}\n \t}\n \n-\tif (internal_config.memory == 0 && internal_config.force_sockets == 0) {\n-\t\tif (internal_config.no_hugetlbfs)\n-\t\t\tinternal_config.memory = MEMSIZE_IF_NO_HUGE_PAGE;\n+\tif (internal_conf->memory == 0 && internal_conf->force_sockets == 0) {\n+\t\tif (internal_conf->no_hugetlbfs)\n+\t\t\tinternal_conf->memory = MEMSIZE_IF_NO_HUGE_PAGE;\n \t}\n \n-\tif (internal_config.vmware_tsc_map == 1) {\n+\tif (internal_conf->vmware_tsc_map == 1) {\n #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT\n \t\trte_cycles_vmware_tsc_map = 1;\n \t\tRTE_LOG (DEBUG, EAL, \"Using VMWARE TSC MAP, \"\n@@ -1151,7 +1121,7 @@ rte_eal_init(int argc, char **argv)\n #endif\n \t}\n \n-\tif (rte_eal_log_init(logid, internal_config.syslog_facility) < 0) {\n+\tif (rte_eal_log_init(logid, internal_conf->syslog_facility) < 0) {\n \t\trte_eal_init_alert(\"Cannot init logging.\");\n \t\trte_errno = ENOMEM;\n \t\trte_atomic32_clear(&run_once);\n@@ -1205,12 +1175,12 @@ rte_eal_init(int argc, char **argv)\n \n \teal_check_mem_on_local_socket();\n \n-\teal_thread_init_master(rte_config.master_lcore);\n+\teal_thread_init_master(config->master_lcore);\n \n \tret = eal_thread_dump_affinity(cpuset, sizeof(cpuset));\n \n \tRTE_LOG(DEBUG, EAL, \"Master lcore %u is ready (tid=%zx;cpuset=[%s%s])\\n\",\n-\t\trte_config.master_lcore, (uintptr_t)thread_id, cpuset,\n+\t\tconfig->master_lcore, (uintptr_t)thread_id, cpuset,\n \t\tret == 0 ? \"\" : \"...\");\n \n \tRTE_LCORE_FOREACH_SLAVE(i) {\n@@ -1289,14 +1259,14 @@ rte_eal_init(int argc, char **argv)\n \t * In no_shconf mode, no runtime directory is created in the first\n \t * place, so no cleanup needed.\n \t */\n-\tif (!internal_config.no_shconf && eal_clean_runtime_dir() < 0) {\n+\tif (!internal_conf->no_shconf && eal_clean_runtime_dir() < 0) {\n \t\trte_eal_init_alert(\"Cannot clear runtime directory\\n\");\n \t\treturn -1;\n \t}\n-\tif (!internal_config.no_telemetry) {\n+\tif (!internal_conf->no_telemetry) {\n \t\tconst char *error_str = NULL;\n \t\tif (rte_telemetry_init(rte_eal_get_runtime_dir(),\n-\t\t\t\t&internal_config.ctrl_cpuset, &error_str)\n+\t\t\t\t&internal_conf->ctrl_cpuset, &error_str)\n \t\t\t\t!= 0) {\n \t\t\trte_eal_init_alert(error_str);\n \t\t\treturn -1;\n@@ -1333,41 +1303,34 @@ rte_eal_cleanup(void)\n \t/* if we're in a primary process, we need to mark hugepages as freeable\n \t * so that finalization can release them back to the system.\n \t */\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n+\n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n \t\trte_memseg_walk(mark_freeable, NULL);\n \trte_service_finalize();\n \trte_mp_channel_cleanup();\n \trte_trace_save();\n \teal_trace_fini();\n-\teal_cleanup_config(&internal_config);\n+\teal_cleanup_config(internal_conf);\n \treturn 0;\n }\n \n-enum rte_proc_type_t\n-rte_eal_process_type(void)\n-{\n-\treturn rte_config.process_type;\n-}\n-\n-int rte_eal_has_hugepages(void)\n-{\n-\treturn ! internal_config.no_hugetlbfs;\n-}\n-\n-int rte_eal_has_pci(void)\n-{\n-\treturn !internal_config.no_pci;\n-}\n-\n int rte_eal_create_uio_dev(void)\n {\n-\treturn internal_config.create_uio_dev;\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n+\n+\treturn internal_conf->create_uio_dev;\n }\n \n enum rte_intr_mode\n rte_eal_vfio_intr_mode(void)\n {\n-\treturn internal_config.vfio_intr_mode;\n+\tconst struct internal_config *internal_conf =\n+\t\t\trte_eal_get_internal_configuration();\n+\n+\treturn internal_conf->vfio_intr_mode;\n }\n \n int\ndiff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c\nindex 427a5557fa..eeebc211b2 100644\n--- a/lib/librte_eal/windows/eal.c\n+++ b/lib/librte_eal/windows/eal.c\n@@ -24,50 +24,21 @@\n \n #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL)\n \n- /* Allow the application to print its usage message too if set */\n-static rte_usage_hook_t\trte_application_usage_hook;\n-\n /* define fd variable here, because file needs to be kept open for the\n  * duration of the program, as we hold a write lock on it in the primary proc\n  */\n static int mem_cfg_fd = -1;\n \n-/* early configuration structure, when memory config is not mmapped */\n-static struct rte_mem_config early_mem_config;\n-\n-/* Address of global and public configuration */\n-static struct rte_config rte_config = {\n-\t\t.mem_config = &early_mem_config,\n-};\n-\n /* internal configuration (per-core) */\n struct lcore_config lcore_config[RTE_MAX_LCORE];\n \n-/* internal configuration */\n-struct internal_config internal_config;\n-\n-/* platform-specific runtime dir */\n-static char runtime_dir[PATH_MAX];\n-\n-const char *\n-rte_eal_get_runtime_dir(void)\n-{\n-\treturn runtime_dir;\n-}\n-\n-/* Return a pointer to the configuration structure */\n-struct rte_config *\n-rte_eal_get_configuration(void)\n-{\n-\treturn &rte_config;\n-}\n-\n /* Detect if we are a primary or a secondary process */\n enum rte_proc_type_t\n eal_proc_type_detect(void)\n {\n \tenum rte_proc_type_t ptype = RTE_PROC_PRIMARY;\n \tconst char *pathname = eal_runtime_config_path();\n+\tconst struct rte_config *config = rte_eal_get_configuration();\n \n \t/* if we can open the file but not get a write-lock we are a secondary\n \t * process. NOTE: if we get a file handle back, we keep that open\n@@ -77,14 +48,14 @@ eal_proc_type_detect(void)\n \t\t_O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE);\n \tif (err == 0) {\n \t\tOVERLAPPED soverlapped = { 0 };\n-\t\tsoverlapped.Offset = sizeof(*rte_config.mem_config);\n+\t\tsoverlapped.Offset = sizeof(*config->mem_config);\n \t\tsoverlapped.OffsetHigh = 0;\n \n \t\tHANDLE hwinfilehandle = (HANDLE)_get_osfhandle(mem_cfg_fd);\n \n \t\tif (!LockFileEx(hwinfilehandle,\n \t\t\tLOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0,\n-\t\t\tsizeof(*rte_config.mem_config), 0, &soverlapped))\n+\t\t\tsizeof(*config->mem_config), 0, &soverlapped))\n \t\t\tptype = RTE_PROC_SECONDARY;\n \t}\n \n@@ -94,36 +65,20 @@ eal_proc_type_detect(void)\n \treturn ptype;\n }\n \n-enum rte_proc_type_t\n-rte_eal_process_type(void)\n-{\n-\treturn rte_config.process_type;\n-}\n-\n-int\n-rte_eal_has_hugepages(void)\n-{\n-\treturn !internal_config.no_hugetlbfs;\n-}\n-\n-enum rte_iova_mode\n-rte_eal_iova_mode(void)\n-{\n-\treturn rte_config.iova_mode;\n-}\n-\n /* display usage */\n static void\n eal_usage(const char *prgname)\n {\n+\trte_usage_hook_t *hook = rte_eal_get_application_usage_hook();\n+\n \tprintf(\"\\nUsage: %s \", prgname);\n \teal_common_usage();\n \t/* Allow the application to print its usage message too\n \t * if hook is set\n \t */\n-\tif (rte_application_usage_hook) {\n+\tif (*hook) {\n \t\tprintf(\"===== Application Usage =====\\n\\n\");\n-\t\trte_application_usage_hook(prgname);\n+\t\t(*hook)(prgname);\n \t}\n }\n \n@@ -134,10 +89,12 @@ eal_log_level_parse(int argc, char **argv)\n \tint opt;\n \tchar **argvopt;\n \tint option_index;\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \targvopt = argv;\n \n-\teal_reset_internal_config(&internal_config);\n+\teal_reset_internal_config(internal_conf);\n \n \twhile ((opt = getopt_long(argc, argvopt, eal_short_options,\n \t\teal_long_options, &option_index)) != EOF) {\n@@ -150,7 +107,7 @@ eal_log_level_parse(int argc, char **argv)\n \n \t\tret = (opt == OPT_LOG_LEVEL_NUM) ?\n \t\t\teal_parse_common_option(opt, optarg,\n-\t\t\t\t&internal_config) : 0;\n+\t\t\t\tinternal_conf) : 0;\n \n \t\t/* common parser is not happy */\n \t\tif (ret < 0)\n@@ -168,6 +125,8 @@ eal_parse_args(int argc, char **argv)\n \tchar **argvopt;\n \tint option_index;\n \tchar *prgname = argv[0];\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \targvopt = argv;\n \n@@ -182,7 +141,7 @@ eal_parse_args(int argc, char **argv)\n \t\t\treturn -1;\n \t\t}\n \n-\t\tret = eal_parse_common_option(opt, optarg, &internal_config);\n+\t\tret = eal_parse_common_option(opt, optarg, internal_conf);\n \t\t/* common parser is not happy */\n \t\tif (ret < 0) {\n \t\t\teal_usage(prgname);\n@@ -214,11 +173,11 @@ eal_parse_args(int argc, char **argv)\n \t\t}\n \t}\n \n-\tif (eal_adjust_config(&internal_config) != 0)\n+\tif (eal_adjust_config(internal_conf) != 0)\n \t\treturn -1;\n \n \t/* sanity checks */\n-\tif (eal_check_common_options(&internal_config) != 0) {\n+\tif (eal_check_common_options(internal_conf) != 0) {\n \t\teal_usage(prgname);\n \t\treturn -1;\n \t}\n@@ -279,6 +238,9 @@ int\n rte_eal_init(int argc, char **argv)\n {\n \tint i, fctret;\n+\tconst struct rte_config *config = rte_eal_get_configuration();\n+\tstruct internal_config *internal_conf =\n+\t\trte_eal_get_internal_configuration();\n \n \trte_eal_log_init(NULL, 0);\n \n@@ -301,21 +263,21 @@ rte_eal_init(int argc, char **argv)\n \t\texit(1);\n \n \t/* Prevent creation of shared memory files. */\n-\tif (internal_config.in_memory == 0) {\n+\tif (internal_conf->in_memory == 0) {\n \t\tRTE_LOG(WARNING, EAL, \"Multi-process support is requested, \"\n \t\t\t\"but not available.\\n\");\n-\t\tinternal_config.in_memory = 1;\n+\t\tinternal_conf->in_memory = 1;\n \t}\n \n-\tif (!internal_config.no_hugetlbfs && (eal_hugepage_info_init() < 0)) {\n+\tif (!internal_conf->no_hugetlbfs && (eal_hugepage_info_init() < 0)) {\n \t\trte_eal_init_alert(\"Cannot get hugepage information\");\n \t\trte_errno = EACCES;\n \t\treturn -1;\n \t}\n \n-\tif (internal_config.memory == 0 && !internal_config.force_sockets) {\n-\t\tif (internal_config.no_hugetlbfs)\n-\t\t\tinternal_config.memory = MEMSIZE_IF_NO_HUGE_PAGE;\n+\tif (internal_conf->memory == 0 && !internal_conf->force_sockets) {\n+\t\tif (internal_conf->no_hugetlbfs)\n+\t\t\tinternal_conf->memory = MEMSIZE_IF_NO_HUGE_PAGE;\n \t}\n \n \tif (eal_mem_win32api_init() < 0) {\n@@ -354,7 +316,7 @@ rte_eal_init(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n-\teal_thread_init_master(rte_config.master_lcore);\n+\teal_thread_init_master(config->master_lcore);\n \n \tRTE_LCORE_FOREACH_SLAVE(i) {\n \n",
    "prefixes": [
        "v7",
        "1/9"
    ]
}