From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 53677A046B for ; Tue, 25 Jun 2019 18:08:34 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 779EB1BB83; Tue, 25 Jun 2019 18:06:17 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 15D411BAC7 for ; Tue, 25 Jun 2019 18:05:58 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jun 2019 09:05:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,416,1557212400"; d="scan'208";a="336894870" Received: from silpixa00399498.ir.intel.com (HELO silpixa00399498.ger.corp.intel.com) ([10.237.223.125]) by orsmga005.jf.intel.com with ESMTP; 25 Jun 2019 09:05:55 -0700 From: Anatoly Burakov To: dev@dpdk.org Cc: Bruce Richardson , david.marchand@redhat.com, thomas@monjalon.net, stephen@networkplumber.org Date: Tue, 25 Jun 2019 17:05:26 +0100 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v2 14/14] eal: prevent different primary/secondary process versions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Currently, nothing stops DPDK to attempt to run primary and secondary processes while having different versions. This can lead to all sorts of weird behavior and makes it harder to maintain compatibility without breaking ABI every once in a while. Fix it by explicitly disallowing running different DPDK versions as primary and secondary processes. Signed-off-by: Anatoly Burakov --- lib/librte_eal/common/eal_common_mcfg.c | 15 +++++++++++++++ lib/librte_eal/common/eal_memcfg.h | 6 ++++++ lib/librte_eal/freebsd/eal/eal.c | 14 ++++++++++++-- lib/librte_eal/linux/eal/eal.c | 14 ++++++++++++-- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/librte_eal/common/eal_common_mcfg.c b/lib/librte_eal/common/eal_common_mcfg.c index fe8d2b726..1825d9083 100644 --- a/lib/librte_eal/common/eal_common_mcfg.c +++ b/lib/librte_eal/common/eal_common_mcfg.c @@ -4,6 +4,7 @@ #include #include +#include #include "eal_internal_cfg.h" #include "eal_memcfg.h" @@ -31,6 +32,18 @@ eal_mcfg_wait_complete(void) rte_pause(); } +int +eal_mcfg_check_version(void) +{ + struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; + + /* check if version from memconfig matches compiled in macro */ + if (mcfg->version != RTE_VERSION) + return -1; + + return 0; +} + void eal_mcfg_update_internal(void) { @@ -47,6 +60,8 @@ eal_mcfg_update_from_internal(void) mcfg->legacy_mem = internal_config.legacy_mem; mcfg->single_file_segments = internal_config.single_file_segments; + /* record current DPDK version */ + mcfg->version = RTE_VERSION; } void diff --git a/lib/librte_eal/common/eal_memcfg.h b/lib/librte_eal/common/eal_memcfg.h index 908542e18..e1aae32df 100644 --- a/lib/librte_eal/common/eal_memcfg.h +++ b/lib/librte_eal/common/eal_memcfg.h @@ -21,6 +21,8 @@ */ struct rte_mem_config { volatile uint32_t magic; /**< Magic number - Sanity check. */ + uint32_t version; + /**< Prevent secondary processes using different DPDK versions. */ /* memory topology */ uint32_t nchannel; /**< Number of channels (0 if unknown). */ @@ -80,6 +82,10 @@ eal_mcfg_update_from_internal(void); void eal_mcfg_wait_complete(void); +/* check if DPDK version of current process matches one stored in the config */ +int +eal_mcfg_check_version(void); + /* set mem config as complete */ void eal_mcfg_complete(void); diff --git a/lib/librte_eal/freebsd/eal/eal.c b/lib/librte_eal/freebsd/eal/eal.c index 81eb44670..ab06d9c6f 100644 --- a/lib/librte_eal/freebsd/eal/eal.c +++ b/lib/librte_eal/freebsd/eal/eal.c @@ -342,7 +342,7 @@ eal_proc_type_detect(void) } /* Sets up rte_config structure with the pointer to shared memory config.*/ -static void +static int rte_config_init(void) { rte_config.process_type = internal_config.process_type; @@ -355,6 +355,10 @@ rte_config_init(void) case RTE_PROC_SECONDARY: rte_eal_config_attach(); eal_mcfg_wait_complete(); + if (eal_mcfg_check_version() < 0) { + RTE_LOG(ERR, EAL, "Primary and secondary process DPDK version mismatch\n"); + return -1; + } rte_eal_config_reattach(); eal_mcfg_update_from_internal(); break; @@ -362,6 +366,7 @@ rte_config_init(void) case RTE_PROC_INVALID: rte_panic("Invalid process type\n"); } + return 0; } /* display usage */ @@ -686,7 +691,12 @@ rte_eal_init(int argc, char **argv) return -1; } - rte_config_init(); + if (rte_config_init() < 0) { + rte_eal_init_alert("Cannot init config"); + rte_errno = EINVAL; + rte_atomic32_clear(&run_once); + return -1; + } if (rte_eal_intr_init() < 0) { rte_eal_init_alert("Cannot init interrupt-handling thread"); diff --git a/lib/librte_eal/linux/eal/eal.c b/lib/librte_eal/linux/eal/eal.c index e2be87e23..4a38718aa 100644 --- a/lib/librte_eal/linux/eal/eal.c +++ b/lib/librte_eal/linux/eal/eal.c @@ -444,7 +444,7 @@ eal_proc_type_detect(void) } /* Sets up rte_config structure with the pointer to shared memory config.*/ -static void +static int rte_config_init(void) { rte_config.process_type = internal_config.process_type; @@ -457,6 +457,10 @@ rte_config_init(void) case RTE_PROC_SECONDARY: rte_eal_config_attach(); eal_mcfg_wait_complete(); + if (eal_mcfg_check_version() < 0) { + RTE_LOG(ERR, EAL, "Primary and secondary process DPDK version mismatch\n"); + return -1; + } rte_eal_config_reattach(); eal_mcfg_update_internal(); break; @@ -464,6 +468,7 @@ rte_config_init(void) case RTE_PROC_INVALID: rte_panic("Invalid process type\n"); } + return 0; } /* Unlocks hugepage directories that were locked by eal_hugepage_info_init */ @@ -971,7 +976,12 @@ rte_eal_init(int argc, char **argv) return -1; } - rte_config_init(); + if (rte_config_init() < 0) { + rte_eal_init_alert("Cannot init config"); + rte_errno = EINVAL; + rte_atomic32_clear(&run_once); + return -1; + } if (rte_eal_intr_init() < 0) { rte_eal_init_alert("Cannot init interrupt-handling thread"); -- 2.17.1