get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 26883,
    "url": "http://patches.dpdk.org/api/patches/26883/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1499940470-31628-2-git-send-email-kubax.kozak@intel.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": "<1499940470-31628-2-git-send-email-kubax.kozak@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1499940470-31628-2-git-send-email-kubax.kozak@intel.com",
    "date": "2017-07-13T10:07:48",
    "name": "[dpdk-dev,v5,1/3] eal: add functions parsing EAL arguments",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": true,
    "hash": "eed2580ef04dc738a2f0ba7254033ea1886767ef",
    "submitter": {
        "id": 666,
        "url": "http://patches.dpdk.org/api/people/666/?format=api",
        "name": "Kuba Kozak",
        "email": "kubax.kozak@intel.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/1499940470-31628-2-git-send-email-kubax.kozak@intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/26883/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/26883/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id D7C922BBE;\n\tThu, 13 Jul 2017 12:22:09 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 8745029CB\n\tfor <dev@dpdk.org>; Thu, 13 Jul 2017 12:22:07 +0200 (CEST)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t13 Jul 2017 03:22:06 -0700",
            "from gklab-246-072.igk.intel.com (HELO Sent) ([10.217.246.72])\n\tby fmsmga001.fm.intel.com with SMTP; 13 Jul 2017 03:22:03 -0700",
            "by Sent (sSMTP sendmail emulation); Thu, 13 Jul 2017 12:12:15 +0200"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos; i=\"5.40,353,1496127600\"; d=\"scan'208\";\n\ta=\"1172056620\"",
        "From": "Kuba Kozak <kubax.kozak@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "deepak.k.jain@intel.com, bruce.richardson@intel.com,\n\tmichalx.k.jastrzebski@intel.com, jacekx.piasecki@intel.com,\n\tKuba Kozak <kubax.kozak@intel.com>",
        "Date": "Thu, 13 Jul 2017 12:07:48 +0200",
        "Message-Id": "<1499940470-31628-2-git-send-email-kubax.kozak@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1499940470-31628-1-git-send-email-kubax.kozak@intel.com>",
        "References": "<1499691101-184293-2-git-send-email-kubax.kozak@intel.com>\n\t<1499940470-31628-1-git-send-email-kubax.kozak@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v5 1/3] eal: add functions parsing EAL arguments",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "added function rte_eal_configure which configure\nEnvironment Abstraction Layer (EAL) using\nconfiguration structure.\n\nSigned-off-by: Kuba Kozak <kubax.kozak@intel.com>\nSuggested-by: Bruce Richardson <bruce.richardson@intel.com>\n---\n lib/Makefile                                    |   3 +\n lib/librte_eal/bsdapp/eal/Makefile              |   4 +\n lib/librte_eal/bsdapp/eal/eal.c                 | 165 +++++++++++----\n lib/librte_eal/bsdapp/eal/rte_eal_version.map   |   1 +\n lib/librte_eal/common/eal_common_lcore.c        |   7 +\n lib/librte_eal/common/eal_common_options.c      | 106 ++++++++++\n lib/librte_eal/common/eal_options.h             |   3 +\n lib/librte_eal/common/include/rte_eal.h         |  20 ++\n lib/librte_eal/linuxapp/eal/Makefile            |   3 +\n lib/librte_eal/linuxapp/eal/eal.c               | 265 ++++++++++++++++--------\n lib/librte_eal/linuxapp/eal/rte_eal_version.map |   1 +\n mk/rte.app.mk                                   |   2 +-\n 12 files changed, 452 insertions(+), 128 deletions(-)",
    "diff": "diff --git a/lib/Makefile b/lib/Makefile\nindex 1080a95..2c6c380 100644\n--- a/lib/Makefile\n+++ b/lib/Makefile\n@@ -34,6 +34,9 @@ include $(RTE_SDK)/mk/rte.vars.mk\n DIRS-y += librte_compat\n DIRS-$(CONFIG_RTE_LIBRTE_CFGFILE) += librte_cfgfile\n DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal\n+ifeq ($(CONFIG_RTE_LIBRTE_CFGFILE),y)\n+DEPDIRS-librte_eal := librte_cfgfile\n+endif\n DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring\n DEPDIRS-librte_ring := librte_eal\n DIRS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += librte_mempool\ndiff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile\nindex a0f9950..d70eefb 100644\n--- a/lib/librte_eal/bsdapp/eal/Makefile\n+++ b/lib/librte_eal/bsdapp/eal/Makefile\n@@ -50,6 +50,10 @@ EXPORT_MAP := rte_eal_version.map\n \n LIBABIVER := 4\n \n+ifeq ($(CONFIG_RTE_LIBRTE_CFGFILE),y)\n+LDLIBS += -lrte_cfgfile\n+endif\n+\n # specific to bsdapp exec-env\n SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_memory.c\ndiff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c\nindex 05f0c1f..4a0c221 100644\n--- a/lib/librte_eal/bsdapp/eal/eal.c\n+++ b/lib/librte_eal/bsdapp/eal/eal.c\n@@ -73,6 +73,7 @@\n #include <rte_version.h>\n #include <rte_atomic.h>\n #include <malloc_heap.h>\n+#include <rte_cfgfile.h>\n \n #include \"eal_private.h\"\n #include \"eal_thread.h\"\n@@ -99,6 +100,8 @@ static struct flock wr_lock = {\n \t\t.l_len = sizeof(early_mem_config.memseg),\n };\n \n+static int run_once_reset_internal_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@@ -347,6 +350,58 @@ eal_log_level_parse(int argc, char **argv)\n \toptarg = old_optarg;\n }\n \n+/* Parse single argument */\n+static int\n+eal_parse_option(int opt, char *optarg, int option_index, char *prgname)\n+{\n+\tint ret;\n+\n+\t/* getopt is not happy, stop right now */\n+\tif (opt == '?') {\n+\t\teal_usage(prgname);\n+\t\tret = -1;\n+\t\tgoto out;\n+\t}\n+\n+\tret = eal_parse_common_option(opt, optarg, &internal_config);\n+\t/* common parser is not happy */\n+\tif (ret < 0) {\n+\t\teal_usage(prgname);\n+\t\tret = -1;\n+\t\tgoto out;\n+\t}\n+\t/* common parser handled this option */\n+\tif (ret == 0)\n+\t\treturn 0;\n+\n+\tswitch (opt) {\n+\tcase 'h':\n+\t\teal_usage(prgname);\n+\t\texit(EXIT_SUCCESS);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tif (opt < OPT_LONG_MIN_NUM && isprint(opt)) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Option %c is not supported \"\n+\t\t\t\t\"on FreeBSD\\n\", opt);\n+\t\t} else if (opt >= OPT_LONG_MIN_NUM &&\n+\t\t\t   opt < OPT_LONG_MAX_NUM) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Option %s is not supported \"\n+\t\t\t\t\"on FreeBSD\\n\",\n+\t\t\t\teal_long_options[option_index].name);\n+\t\t} else {\n+\t\t\tRTE_LOG(ERR, EAL, \"Option %d is not supported \"\n+\t\t\t\t\"on FreeBSD\\n\", opt);\n+\t\t}\n+\t\teal_usage(prgname);\n+\t\tret = -1;\n+\t\tgoto out;\n+\t}\n+\treturn 0;\n+out:\n+\treturn ret;\n+}\n+\n /* Parse the argument given in the command line of the application */\n static int\n eal_parse_args(int argc, char **argv)\n@@ -367,45 +422,9 @@ eal_parse_args(int argc, char **argv)\n \twhile ((opt = getopt_long(argc, argvopt, eal_short_options,\n \t\t\t\t  eal_long_options, &option_index)) != EOF) {\n \n-\t\t/* getopt is not happy, stop right now */\n-\t\tif (opt == '?') {\n-\t\t\teal_usage(prgname);\n-\t\t\tret = -1;\n-\t\t\tgoto out;\n-\t\t}\n-\n-\t\tret = eal_parse_common_option(opt, optarg, &internal_config);\n-\t\t/* common parser is not happy */\n-\t\tif (ret < 0) {\n-\t\t\teal_usage(prgname);\n-\t\t\tret = -1;\n-\t\t\tgoto out;\n-\t\t}\n-\t\t/* common parser handled this option */\n-\t\tif (ret == 0)\n-\t\t\tcontinue;\n-\n-\t\tswitch (opt) {\n-\t\tcase 'h':\n-\t\t\teal_usage(prgname);\n-\t\t\texit(EXIT_SUCCESS);\n-\t\tdefault:\n-\t\t\tif (opt < OPT_LONG_MIN_NUM && isprint(opt)) {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"Option %c is not supported \"\n-\t\t\t\t\t\"on FreeBSD\\n\", opt);\n-\t\t\t} else if (opt >= OPT_LONG_MIN_NUM &&\n-\t\t\t\t   opt < OPT_LONG_MAX_NUM) {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"Option %s is not supported \"\n-\t\t\t\t\t\"on FreeBSD\\n\",\n-\t\t\t\t\teal_long_options[option_index].name);\n-\t\t\t} else {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"Option %d is not supported \"\n-\t\t\t\t\t\"on FreeBSD\\n\", opt);\n-\t\t\t}\n-\t\t\teal_usage(prgname);\n-\t\t\tret = -1;\n+\t\tret = eal_parse_option(opt, optarg, option_index, prgname);\n+\t\tif (ret < 0)\n \t\t\tgoto out;\n-\t\t}\n \t}\n \n \tif (eal_adjust_config(&internal_config) != 0) {\n@@ -517,7 +536,10 @@ rte_eal_init(int argc, char **argv)\n \n \tthread_id = pthread_self();\n \n-\teal_reset_internal_config(&internal_config);\n+\tif (!run_once_reset_internal_config) {\n+\t\teal_reset_internal_config(&internal_config);\n+\t\trun_once_reset_internal_config = 1;\n+\t}\n \n \t/* set log level as early as possible */\n \teal_log_level_parse(argc, argv);\n@@ -677,3 +699,68 @@ rte_eal_process_type(void)\n {\n \treturn rte_config.process_type;\n }\n+\n+#ifdef RTE_LIBRTE_CFGFILE\n+int\n+rte_eal_configure(struct rte_cfgfile *cfg, char *prgname)\n+{\n+\tint n_entries;\n+\tint i;\n+\tint opt;\n+\tint option_index;\n+\n+\tif (cfg == NULL) {\n+\t\trte_errno = -EINVAL;\n+\t\treturn -1;\n+\t}\n+\n+\tn_entries = rte_cfgfile_section_num_entries(cfg, \"DPDK\");\n+\n+\tif (n_entries < 1) {\n+\t\tprintf(\"No DPDK section entries in cfgfile object\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tstruct rte_cfgfile_entry entries[n_entries];\n+\n+\tif (n_entries !=\n+\t\t\trte_cfgfile_section_entries(cfg, \"DPDK\", entries,\n+\t\t\t\t\tn_entries)) {\n+\t\trte_eal_init_alert(\"Unexpected fault.\");\n+\t\trte_errno = EFAULT;\n+\t\treturn -1;\n+\t}\n+\n+\tif (!run_once_reset_internal_config) {\n+\t\teal_reset_internal_config(&internal_config);\n+\t\trun_once_reset_internal_config = 1;\n+\t}\n+\n+\t/* set log level as early as possible */\n+\teal_log_level_cfg(cfg);\n+\n+\tif (rte_eal_cpu_init() < 0) {\n+\t\trte_eal_init_alert(\"Cannot detect lcores.\");\n+\t\trte_errno = ENOTSUP;\n+\t\treturn -1;\n+\t}\n+\n+\tfor (i = 0; i < n_entries; i++) {\n+\t\teal_getopt(entries[i].name, &opt, &option_index);\n+\n+\t\tif (eal_parse_option(opt, entries[i].value,\n+\t\t\t\toption_index, prgname) != 0) {\n+\t\t\trte_eal_init_alert(\"Invalid config file arguments.\");\n+\t\t\trte_errno = EINVAL;\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tif (parse_vdev_devices(cfg) < 0) {\n+\t\trte_eal_init_alert(\"Couldn't parse vdevs\");\n+\t\trte_errno = ENOMEM;\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+#endif\ndiff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\nindex 381f895..932f990 100644\n--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n@@ -200,6 +200,7 @@ DPDK_17.08 {\n \trte_bus_find;\n \trte_bus_find_by_device;\n \trte_bus_find_by_name;\n+\trte_eal_configure;\n \n } DPDK_17.05;\n \ndiff --git a/lib/librte_eal/common/eal_common_lcore.c b/lib/librte_eal/common/eal_common_lcore.c\nindex 84fa0cb..d0f4c6f 100644\n--- a/lib/librte_eal/common/eal_common_lcore.c\n+++ b/lib/librte_eal/common/eal_common_lcore.c\n@@ -53,11 +53,18 @@\n int\n rte_eal_cpu_init(void)\n {\n+\tstatic int run_once;\n+\tstatic int ret;\n \t/* pointer to global configuration */\n \tstruct rte_config *config = rte_eal_get_configuration();\n \tunsigned lcore_id;\n \tunsigned count = 0;\n \n+\t/* No need to calculate this function again if we know the result */\n+\tif (run_once)\n+\t\treturn ret;\n+\trun_once = 1;\n+\n \t/*\n \t * Parse the maximum set of logical cores, detect the subset of running\n \t * ones and enable them by default.\ndiff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c\nindex 075b0ea..aaf0f2c 100644\n--- a/lib/librte_eal/common/eal_common_options.c\n+++ b/lib/librte_eal/common/eal_common_options.c\n@@ -50,6 +50,10 @@\n #include <rte_version.h>\n #include <rte_devargs.h>\n #include <rte_memcpy.h>\n+#ifdef RTE_LIBRTE_CFGFILE\n+#include <rte_cfgfile.h>\n+#include <rte_errno.h>\n+#endif\n \n #include \"eal_internal_cfg.h\"\n #include \"eal_options.h\"\n@@ -1078,3 +1082,105 @@ eal_common_usage(void)\n \t       \"  --\"OPT_NO_SHCONF\"         No shared config (mmap'd files)\\n\"\n \t       \"\\n\", RTE_MAX_LCORE);\n }\n+\n+#ifdef RTE_LIBRTE_CFGFILE\n+/* Parse the arguments for --log-level only */\n+void\n+eal_log_level_cfg(struct rte_cfgfile *cfg)\n+{\n+\tconst char *entry;\n+\n+\tentry = rte_cfgfile_get_entry(cfg, \"DPDK\", OPT_LOG_LEVEL);\n+\tif (entry)\n+\t\teal_parse_common_option(OPT_LOG_LEVEL_NUM, entry,\n+\t\t\t\t&internal_config);\n+}\n+#endif\n+\n+#ifdef RTE_LIBRTE_CFGFILE\n+static void rte_eal_init_alert(const char *msg)\n+{\n+\tfprintf(stderr, \"EAL: FATAL: %s\\n\", msg);\n+\tRTE_LOG(ERR, EAL, \"%s\\n\", msg);\n+}\n+\n+#define vdev_buff_size\t\t200\n+#define sectionname_size\t20\n+int\n+parse_vdev_devices(struct rte_cfgfile *cfg)\n+{\n+\tchar sectionname[sectionname_size] = \"DPDK.vdev0\";\n+\tchar buffer[vdev_buff_size];\n+\tint vdev_nb = 0;\n+\tint n_entries;\n+\tint buf_len;\n+\tchar *buf_ptr;\n+\tint i;\n+\tint ret;\n+\n+\t/* ----------- parsing VDEVS */\n+\tfor (vdev_nb = 1; rte_cfgfile_has_section(cfg, sectionname);\n+\t\t\tvdev_nb++) {\n+\t\tn_entries = rte_cfgfile_section_num_entries(cfg, sectionname);\n+\n+\t\tstruct rte_cfgfile_entry entries[n_entries];\n+\n+\t\tif (n_entries != rte_cfgfile_section_entries(cfg, sectionname,\n+\t\t\t\tentries, n_entries)) {\n+\t\t\trte_eal_init_alert(\"Unexpected fault.\");\n+\t\t\trte_errno = EFAULT;\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tbuffer[0] = '\\0';\n+\t\tbuf_ptr = buffer;\n+\t\tbuf_len = vdev_buff_size;\n+\t\tfor (i = 0; i < n_entries; i++) {\n+\t\t\tret = snprintf(buf_ptr, buf_len, \"%s%s%s%s\",\n+\t\t\t\t\tentries[i].name,\n+\t\t\t\t\t(entries[i].value[0] != '\\0') ?\n+\t\t\t\t\t\t\t\"=\" : \"\",\n+\t\t\t\t\tentries[i].value,\n+\t\t\t\t\t(i < (n_entries - 1)) ? \",\" : \"\");\n+\t\t\tif (ret >= buf_len) {\n+\t\t\t\tprintf(\"parse_vdev_devices(): buffer[] size is \"\n+\t\t\t\t\t\t\"to small\\n\");\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t\tbuf_len -= ret;\n+\t\t\tbuf_ptr += ret;\n+\t\t}\n+\n+\t\t/* parsing vdev */\n+\t\tif (rte_eal_devargs_add(RTE_DEVTYPE_UNDEFINED,\n+\t\t\t\tbuffer) < 0) {\n+\t\t\treturn -1;\n+\t\t}\n+\t\tsnprintf(sectionname, sectionname_size, \"DPDK.vdev%d\", vdev_nb);\n+\t}\n+\t/* ----------- parsing VDEVS */\n+\treturn 0;\n+}\n+\n+void\n+eal_getopt(const char *str, int *opt, int *option_index)\n+{\n+\tint i;\n+\n+\t*opt = '?';\n+\t*option_index = 0;\n+\n+\tif (strlen(str) == 1) {\n+\t\t*opt = *str;\n+\t\treturn;\n+\t}\n+\n+\tfor (i = 0; eal_long_options[i].name != NULL; i++) {\n+\t\tif (strcmp(str, eal_long_options[i].name) == 0) {\n+\t\t\t*opt = eal_long_options[i].val;\n+\t\t\t*option_index = i;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+}\n+#endif\ndiff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h\nindex a881c62..0fce11c 100644\n--- a/lib/librte_eal/common/eal_options.h\n+++ b/lib/librte_eal/common/eal_options.h\n@@ -96,5 +96,8 @@ int eal_check_common_options(struct internal_config *internal_cfg);\n void eal_common_usage(void);\n enum rte_proc_type_t eal_proc_type_detect(void);\n int eal_plugins_init(void);\n+void eal_log_level_cfg(struct rte_cfgfile *cfg);\n+int parse_vdev_devices(struct rte_cfgfile *cfg);\n+void eal_getopt(const char *str, int *opt, int *option_index);\n \n #endif /* EAL_OPTIONS_H */\ndiff --git a/lib/librte_eal/common/include/rte_eal.h b/lib/librte_eal/common/include/rte_eal.h\nindex 6b7c5ca..a1c78c0 100644\n--- a/lib/librte_eal/common/include/rte_eal.h\n+++ b/lib/librte_eal/common/include/rte_eal.h\n@@ -46,6 +46,8 @@\n #include <rte_per_lcore.h>\n #include <rte_config.h>\n \n+struct rte_cfgfile; /* forward declaration of struct */\n+\n #ifdef __cplusplus\n extern \"C\" {\n #endif\n@@ -188,6 +190,24 @@ int rte_eal_iopl_init(void);\n  */\n int rte_eal_init(int argc, char **argv);\n \n+#ifdef RTE_LIBRTE_CFGFILE\n+/**\n+ * Initialize the Environment Abstraction Layer (EAL) using\n+ * configuration structure\n+ *\n+ * @param cfg\n+ *   pointer to config file structure.\n+ * @param prgname\n+ *   pointer to string with execution path\n+ *\n+ * @return\n+ *  - On success, return 0\n+ *  - On failure, returns -1.\n+ */\n+int\n+rte_eal_configure(struct rte_cfgfile *cfg, char *prgname);\n+#endif\n+\n /**\n  * Check if a primary process is currently alive\n  *\ndiff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile\nindex 8651e27..7c1c559 100644\n--- a/lib/librte_eal/linuxapp/eal/Makefile\n+++ b/lib/librte_eal/linuxapp/eal/Makefile\n@@ -53,6 +53,9 @@ LDLIBS += -lrt\n ifeq ($(CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES),y)\n LDLIBS += -lnuma\n endif\n+ifeq ($(CONFIG_RTE_LIBRTE_CFGFILE),y)\n+LDLIBS += -lrte_cfgfile\n+endif\n \n # specific to linuxapp exec-env\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) := eal.c\ndiff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c\nindex 7c78f2d..f09aeff 100644\n--- a/lib/librte_eal/linuxapp/eal/eal.c\n+++ b/lib/librte_eal/linuxapp/eal/eal.c\n@@ -78,6 +78,9 @@\n #include <rte_version.h>\n #include <rte_atomic.h>\n #include <malloc_heap.h>\n+#ifdef RTE_LIBRTE_CFGFILE\n+#include <rte_cfgfile.h>\n+#endif\n \n #include \"eal_private.h\"\n #include \"eal_thread.h\"\n@@ -101,6 +104,8 @@ static struct rte_mem_config early_mem_config;\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 \n+static int run_once_reset_internal_config;\n+\n static struct flock wr_lock = {\n \t\t.l_type = F_WRLCK,\n \t\t.l_whence = SEEK_SET,\n@@ -515,119 +520,135 @@ eal_log_level_parse(int argc, char **argv)\n \toptarg = old_optarg;\n }\n \n-/* Parse the argument given in the command line of the application */\n+/* Parse single argument */\n static int\n-eal_parse_args(int argc, char **argv)\n+eal_parse_option(int opt, char *optarg, int option_index, char *prgname)\n {\n-\tint opt, ret;\n-\tchar **argvopt;\n-\tint option_index;\n-\tchar *prgname = argv[0];\n-\tconst int old_optind = optind;\n-\tconst int old_optopt = optopt;\n-\tchar * const old_optarg = optarg;\n+\tint ret;\n \n-\targvopt = argv;\n-\toptind = 1;\n+\t/* getopt is not happy, stop right now */\n+\tif (opt == '?') {\n+\t\teal_usage(prgname);\n+\t\tret = -1;\n+\t\tgoto out;\n+\t}\n \n-\twhile ((opt = getopt_long(argc, argvopt, eal_short_options,\n-\t\t\t\t  eal_long_options, &option_index)) != EOF) {\n+\tret = eal_parse_common_option(opt, optarg, &internal_config);\n+\t/* common parser is not happy */\n+\tif (ret < 0) {\n+\t\teal_usage(prgname);\n+\t\tret = -1;\n+\t\tgoto out;\n+\t}\n+\t/* common parser handled this option */\n+\tif (ret == 0)\n+\t\treturn 0;\n \n-\t\t/* getopt is not happy, stop right now */\n-\t\tif (opt == '?') {\n+\tswitch (opt) {\n+\tcase 'h':\n+\t\teal_usage(prgname);\n+\t\texit(EXIT_SUCCESS);\n+\t\tbreak;\n+\n+\t/* long options */\n+\tcase OPT_XEN_DOM0_NUM:\n+#ifdef RTE_LIBRTE_XEN_DOM0\n+\t\tinternal_config.xen_dom0_support = 1;\n+\t\tbreak;\n+#else\n+\t\tRTE_LOG(ERR, EAL, \"Can't support DPDK app \"\n+\t\t\t\"running on Dom0, please configure\"\n+\t\t\t\" RTE_LIBRTE_XEN_DOM0=y\\n\");\n+\t\tret = -1;\n+\t\tgoto out;\n+#endif\n+\n+\tcase OPT_HUGE_DIR_NUM:\n+\t\tinternal_config.hugepage_dir = optarg;\n+\t\tbreak;\n+\n+\tcase OPT_FILE_PREFIX_NUM:\n+\t\tinternal_config.hugefile_prefix = optarg;\n+\t\tbreak;\n+\n+\tcase OPT_SOCKET_MEM_NUM:\n+\t\tif (eal_parse_socket_mem(optarg) < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"invalid parameters for --\"\n+\t\t\t\t\tOPT_SOCKET_MEM \"\\n\");\n \t\t\teal_usage(prgname);\n \t\t\tret = -1;\n \t\t\tgoto out;\n \t\t}\n+\t\tbreak;\n \n-\t\tret = eal_parse_common_option(opt, optarg, &internal_config);\n-\t\t/* common parser is not happy */\n-\t\tif (ret < 0) {\n+\tcase OPT_BASE_VIRTADDR_NUM:\n+\t\tif (eal_parse_base_virtaddr(optarg) < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"invalid parameter for --\"\n+\t\t\t\t\tOPT_BASE_VIRTADDR \"\\n\");\n \t\t\teal_usage(prgname);\n \t\t\tret = -1;\n \t\t\tgoto out;\n \t\t}\n-\t\t/* common parser handled this option */\n-\t\tif (ret == 0)\n-\t\t\tcontinue;\n+\t\tbreak;\n \n-\t\tswitch (opt) {\n-\t\tcase 'h':\n+\tcase OPT_VFIO_INTR_NUM:\n+\t\tif (eal_parse_vfio_intr(optarg) < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"invalid parameters for --\"\n+\t\t\t\t\tOPT_VFIO_INTR \"\\n\");\n \t\t\teal_usage(prgname);\n-\t\t\texit(EXIT_SUCCESS);\n-\n-\t\t/* long options */\n-\t\tcase OPT_XEN_DOM0_NUM:\n-#ifdef RTE_LIBRTE_XEN_DOM0\n-\t\t\tinternal_config.xen_dom0_support = 1;\n-#else\n-\t\t\tRTE_LOG(ERR, EAL, \"Can't support DPDK app \"\n-\t\t\t\t\"running on Dom0, please configure\"\n-\t\t\t\t\" RTE_LIBRTE_XEN_DOM0=y\\n\");\n \t\t\tret = -1;\n \t\t\tgoto out;\n-#endif\n-\t\t\tbreak;\n+\t\t}\n+\t\tbreak;\n \n-\t\tcase OPT_HUGE_DIR_NUM:\n-\t\t\tinternal_config.hugepage_dir = optarg;\n-\t\t\tbreak;\n+\tcase OPT_CREATE_UIO_DEV_NUM:\n+\t\tinternal_config.create_uio_dev = 1;\n+\t\tbreak;\n \n-\t\tcase OPT_FILE_PREFIX_NUM:\n-\t\t\tinternal_config.hugefile_prefix = optarg;\n-\t\t\tbreak;\n+\tdefault:\n+\t\tif (opt < OPT_LONG_MIN_NUM && isprint(opt)) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Option %c is not supported \"\n+\t\t\t\t\"on Linux\\n\", opt);\n+\t\t} else if (opt >= OPT_LONG_MIN_NUM &&\n+\t\t\t   opt < OPT_LONG_MAX_NUM) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Option %s is not supported \"\n+\t\t\t\t\"on Linux\\n\",\n+\t\t\t\teal_long_options[option_index].name);\n+\t\t} else {\n+\t\t\tRTE_LOG(ERR, EAL, \"Option %d is not supported \"\n+\t\t\t\t\"on Linux\\n\", opt);\n+\t\t}\n+\t\teal_usage(prgname);\n+\t\tret = -1;\n+\t\tgoto out;\n+\t}\n \n-\t\tcase OPT_SOCKET_MEM_NUM:\n-\t\t\tif (eal_parse_socket_mem(optarg) < 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\tbreak;\n+\treturn 0;\n+out:\n+\treturn ret;\n+}\n \n-\t\tcase OPT_BASE_VIRTADDR_NUM:\n-\t\t\tif (eal_parse_base_virtaddr(optarg) < 0) {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"invalid parameter for --\"\n-\t\t\t\t\t\tOPT_BASE_VIRTADDR \"\\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\tbreak;\n+/* Parse the argument given in the command line of the application */\n+static int\n+eal_parse_args(int argc, char **argv)\n+{\n+\tint opt, ret;\n+\tchar **argvopt;\n+\tint option_index;\n+\tchar *prgname = argv[0];\n+\tconst int old_optind = optind;\n+\tconst int old_optopt = optopt;\n+\tchar * const old_optarg = optarg;\n \n-\t\tcase OPT_VFIO_INTR_NUM:\n-\t\t\tif (eal_parse_vfio_intr(optarg) < 0) {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"invalid parameters for --\"\n-\t\t\t\t\t\tOPT_VFIO_INTR \"\\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\tbreak;\n+\targvopt = argv;\n+\toptind = 1;\n \n-\t\tcase OPT_CREATE_UIO_DEV_NUM:\n-\t\t\tinternal_config.create_uio_dev = 1;\n-\t\t\tbreak;\n+\twhile ((opt = getopt_long(argc, argvopt, eal_short_options,\n+\t\t\t\t  eal_long_options, &option_index)) != EOF) {\n \n-\t\tdefault:\n-\t\t\tif (opt < OPT_LONG_MIN_NUM && isprint(opt)) {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"Option %c is not supported \"\n-\t\t\t\t\t\"on Linux\\n\", opt);\n-\t\t\t} else if (opt >= OPT_LONG_MIN_NUM &&\n-\t\t\t\t   opt < OPT_LONG_MAX_NUM) {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"Option %s is not supported \"\n-\t\t\t\t\t\"on Linux\\n\",\n-\t\t\t\t\teal_long_options[option_index].name);\n-\t\t\t} else {\n-\t\t\t\tRTE_LOG(ERR, EAL, \"Option %d is not supported \"\n-\t\t\t\t\t\"on Linux\\n\", opt);\n-\t\t\t}\n-\t\t\teal_usage(prgname);\n-\t\t\tret = -1;\n+\t\tret = eal_parse_option(opt, optarg, option_index, prgname);\n+\t\tif (ret < 0)\n \t\t\tgoto out;\n-\t\t}\n \t}\n \n \tif (eal_adjust_config(&internal_config) != 0) {\n@@ -774,7 +795,10 @@ rte_eal_init(int argc, char **argv)\n \n \tthread_id = pthread_self();\n \n-\teal_reset_internal_config(&internal_config);\n+\tif (!run_once_reset_internal_config) {\n+\t\teal_reset_internal_config(&internal_config);\n+\t\trun_once_reset_internal_config = 1;\n+\t}\n \n \t/* set log level as early as possible */\n \teal_log_level_parse(argc, argv);\n@@ -995,3 +1019,68 @@ rte_eal_check_module(const char *module_name)\n \t/* Module has been found */\n \treturn 1;\n }\n+\n+#ifdef RTE_LIBRTE_CFGFILE\n+int\n+rte_eal_configure(struct rte_cfgfile *cfg, char *prgname)\n+{\n+\tint n_entries;\n+\tint i;\n+\tint opt;\n+\tint option_index;\n+\n+\tif (cfg == NULL) {\n+\t\trte_errno = -EINVAL;\n+\t\treturn -1;\n+\t}\n+\n+\tn_entries = rte_cfgfile_section_num_entries(cfg, \"DPDK\");\n+\n+\tif (n_entries < 1) {\n+\t\tprintf(\"No DPDK section entries in cfgfile object\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tstruct rte_cfgfile_entry entries[n_entries];\n+\n+\tif (n_entries !=\n+\t\t\trte_cfgfile_section_entries(cfg, \"DPDK\", entries,\n+\t\t\t\t\tn_entries)) {\n+\t\trte_eal_init_alert(\"Unexpected fault.\");\n+\t\trte_errno = EFAULT;\n+\t\treturn -1;\n+\t}\n+\n+\tif (!run_once_reset_internal_config) {\n+\t\teal_reset_internal_config(&internal_config);\n+\t\trun_once_reset_internal_config = 1;\n+\t}\n+\n+\t/* set log level as early as possible */\n+\teal_log_level_cfg(cfg);\n+\n+\tif (rte_eal_cpu_init() < 0) {\n+\t\trte_eal_init_alert(\"Cannot detect lcores.\");\n+\t\trte_errno = ENOTSUP;\n+\t\treturn -1;\n+\t}\n+\n+\tfor (i = 0; i < n_entries; i++) {\n+\t\teal_getopt(entries[i].name, &opt, &option_index);\n+\n+\t\tif (eal_parse_option(opt, entries[i].value,\n+\t\t\t\toption_index, prgname) != 0) {\n+\t\t\trte_eal_init_alert(\"Invalid config file arguments.\");\n+\t\t\trte_errno = EINVAL;\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tif (parse_vdev_devices(cfg) < 0) {\n+\t\trte_eal_init_alert(\"Couldn't parse vdevs\");\n+\t\trte_errno = ENOMEM;\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+#endif\ndiff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\nindex 0f9e009..d206fd3 100644\n--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n@@ -205,6 +205,7 @@ DPDK_17.08 {\n \trte_bus_find;\n \trte_bus_find_by_device;\n \trte_bus_find_by_name;\n+\trte_eal_configure;\n \n } DPDK_17.05;\n \ndiff --git a/mk/rte.app.mk b/mk/rte.app.mk\nindex 5bb4290..b883d08 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -81,7 +81,6 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_POWER)          += -lrte_power\n \n _LDLIBS-$(CONFIG_RTE_LIBRTE_TIMER)          += -lrte_timer\n _LDLIBS-$(CONFIG_RTE_LIBRTE_EFD)            += -lrte_efd\n-_LDLIBS-$(CONFIG_RTE_LIBRTE_CFGFILE)        += -lrte_cfgfile\n \n _LDLIBS-y += --whole-archive\n \n@@ -97,6 +96,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_MEMPOOL)        += -lrte_mempool\n _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring\n _LDLIBS-$(CONFIG_RTE_LIBRTE_RING)           += -lrte_ring\n _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrte_eal\n+_LDLIBS-$(CONFIG_RTE_LIBRTE_CFGFILE)        += -lrte_cfgfile\n _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE)        += -lrte_cmdline\n _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder\n \n",
    "prefixes": [
        "dpdk-dev",
        "v5",
        "1/3"
    ]
}