From 8eea6474f37eff51eb6f9a178ec6790cf5bed53a Mon Sep 17 00:00:00 2001 From: wuchangsheng Date: Tue, 30 Mar 2021 16:27:35 +0800 Subject: [PATCH] dpdk-support-gazelle-03-cfg-options --- config/rte_config.h | 3 +- lib/librte_eal/common/eal_common_options.c | 46 ++++++++++++++++++---- lib/librte_eal/common/eal_internal_cfg.h | 2 + lib/librte_eal/common/eal_options.h | 7 +++- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/config/rte_config.h b/config/rte_config.h index d30786b..b848b1c 100644 --- a/config/rte_config.h +++ b/config/rte_config.h @@ -39,7 +39,8 @@ #define RTE_MAX_MEMSEG_PER_TYPE 32768 #define RTE_MAX_MEM_MB_PER_TYPE 65536 #define RTE_MAX_MEM_MB 524288 -#define RTE_MAX_MEMZONE 2560 +#define RTE_MAX_MEMZONE 65535 +#define RTE_MAX_SECONDARY 256 #define RTE_MAX_TAILQ 32 #define RTE_LOG_DP_LEVEL RTE_LOG_INFO #define RTE_BACKTRACE 1 diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index a7f9c5f..34f4199 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -82,6 +82,7 @@ eal_long_options[] = { {OPT_LEGACY_MEM, 0, NULL, OPT_LEGACY_MEM_NUM }, {OPT_SINGLE_FILE_SEGMENTS, 0, NULL, OPT_SINGLE_FILE_SEGMENTS_NUM}, {OPT_MATCH_ALLOCATIONS, 0, NULL, OPT_MATCH_ALLOCATIONS_NUM}, + {OPT_MAP_PERFECT, 0, NULL, OPT_MAP_PERFECT_NUM }, {0, 0, NULL, 0 } }; @@ -221,6 +222,7 @@ eal_reset_internal_config(struct internal_config *internal_cfg) internal_cfg->user_mbuf_pool_ops_name = NULL; CPU_ZERO(&internal_cfg->ctrl_cpuset); internal_cfg->init_complete = 0; + internal_cfg->map_perfect = 0; } static int @@ -1097,7 +1099,7 @@ eal_parse_iova_mode(const char *name) } static int -eal_parse_base_virtaddr(const char *arg) +eal_parse_base_virtaddr(const char *arg, struct internal_config *conf) { char *end; uint64_t addr; @@ -1120,7 +1122,7 @@ eal_parse_base_virtaddr(const char *arg) * it can align to 2MB for x86. So this alignment can also be used * on x86 and other architectures. */ - internal_config.base_virtaddr = + conf->base_virtaddr = RTE_PTR_ALIGN_CEIL((uintptr_t)addr, (size_t)RTE_PGSIZE_16M); return 0; @@ -1440,7 +1442,7 @@ eal_parse_common_option(int opt, const char *optarg, } break; case OPT_BASE_VIRTADDR_NUM: - if (eal_parse_base_virtaddr(optarg) < 0) { + if (eal_parse_base_virtaddr(optarg, conf) < 0) { RTE_LOG(ERR, EAL, "invalid parameter for --" OPT_BASE_VIRTADDR "\n"); return -1; @@ -1553,11 +1555,33 @@ eal_adjust_config(struct internal_config *internal_cfg) } int -eal_check_common_options(struct internal_config *internal_cfg) +eal_sec_adjust_config(struct internal_config *internal_cfg) { - struct rte_config *cfg = rte_eal_get_configuration(); + struct internal_config *internal_cfg_head; + internal_cfg->process_type = RTE_PROC_SECONDARY; + + internal_cfg_head = rte_eal_sec_get_internal_config(0); + for (int i = 0; i < RTE_MAX_SECONDARY; ++i) { + if (!internal_cfg_head[i].pri_and_sec) + continue; + if (internal_cfg == &internal_cfg_head[i]) + continue; + if (!strcmp(internal_cfg_head[i].hugefile_prefix, internal_cfg->hugefile_prefix)) + return -EALREADY; + } + + for (int i = 0; i < RTE_MAX_NUMA_NODES; i++) + internal_cfg->memory += internal_cfg->socket_mem[i]; + + return 0; +} - if (cfg->lcore_role[cfg->master_lcore] != ROLE_RTE) { +int +eal_check_common_options(struct internal_config *internal_cfg, + struct rte_config *cfg) +{ + if (!internal_cfg->pri_and_sec && + cfg->lcore_role[cfg->master_lcore] != ROLE_RTE) { RTE_LOG(ERR, EAL, "Master lcore is not enabled for DPDK\n"); return -1; } @@ -1602,7 +1626,7 @@ eal_check_common_options(struct internal_config *internal_cfg) "be specified together with --"OPT_NO_HUGE"\n"); return -1; } - if (internal_config.force_socket_limits && internal_config.legacy_mem) { + if (internal_cfg->force_socket_limits && internal_config.legacy_mem) { RTE_LOG(ERR, EAL, "Option --"OPT_SOCKET_LIMIT " is only supported in non-legacy memory mode\n"); } @@ -1635,6 +1659,14 @@ eal_check_common_options(struct internal_config *internal_cfg) "-m or --"OPT_SOCKET_MEM"\n"); } + if (internal_cfg->map_perfect || internal_cfg->pri_and_sec) { + if (!internal_cfg->legacy_mem || internal_cfg->in_memory || internal_cfg->no_hugetlbfs) { + RTE_LOG(ERR, EAL, "Option --"OPT_LEGACY_MEM" or "OPT_IN_MEMORY" or "OPT_NO_HUGE" " + "is not compatible with --"OPT_MAP_PERFECT" and "OPT_PRI_AND_SEC"\n"); + return -1; + } + } + return 0; } diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h index a42f349..50d5da1 100644 --- a/lib/librte_eal/common/eal_internal_cfg.h +++ b/lib/librte_eal/common/eal_internal_cfg.h @@ -82,6 +82,8 @@ struct internal_config { rte_cpuset_t ctrl_cpuset; /**< cpuset for ctrl threads */ volatile unsigned int init_complete; /**< indicates whether EAL has completed initialization */ + volatile unsigned pri_and_sec; + volatile unsigned map_perfect; }; extern struct internal_config internal_config; /**< Global EAL configuration. */ diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index 9855429..b42d41d 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -69,6 +69,10 @@ enum { OPT_IOVA_MODE_NUM, #define OPT_MATCH_ALLOCATIONS "match-allocations" OPT_MATCH_ALLOCATIONS_NUM, +#define OPT_PRI_AND_SEC "pri-and-sec" + OPT_PRI_AND_SEC_NUM, +#define OPT_MAP_PERFECT "map-perfect" + OPT_MAP_PERFECT_NUM, OPT_LONG_MAX_NUM }; @@ -79,8 +83,9 @@ int eal_parse_common_option(int opt, const char *argv, struct internal_config *conf); int eal_option_device_parse(void); int eal_adjust_config(struct internal_config *internal_cfg); +int eal_sec_adjust_config(struct internal_config *internal_cfg); int eal_cleanup_config(struct internal_config *internal_cfg); -int eal_check_common_options(struct internal_config *internal_cfg); +int eal_check_common_options(struct internal_config *internal_cfg, struct rte_config *cfg); void eal_common_usage(void); enum rte_proc_type_t eal_proc_type_detect(void); int eal_plugins_init(void); -- 2.23.0