From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1978E42C05; Thu, 1 Jun 2023 18:09:59 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E421840EF0; Thu, 1 Jun 2023 18:09:58 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mails.dpdk.org (Postfix) with ESMTP id 82C6B40DDC; Thu, 1 Jun 2023 18:09:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1685635797; x=1717171797; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=1fJZQayJq4PQ2Ewd5o0LTmiN42joEj1tDOrTT75fGqg=; b=e1BgiZghcpbdSo2HOjvqfWadjzKHyzE2sWFu/jF9WBFxlXxpXL8C91pv PqGIbpJ86XOO5zYphcvdbVPjzKs4heS9yit13uwqqrRQXnCvlBRiGTxIL gA10VzddwgJT0aDR/rn122QDqQlhy8q29VO8N6MtVjML5okEN8v4EhPzu u2nlXD3i6JyAs75l2Gs7MDQrqVBhGSGoZ5ed3qqwyqg/Ky1V6wotqbzaN qMOpO5xUJ+J1oXPBQOA4hZc2xyOImhcuFpEnd6w6FYrSW4VCTJWuEZMyP a45i7t3OagwEM3ve+vHcl+xTI6xyU+M2+lGzzoZ3N0srVE652pvPR+2c8 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10728"; a="335223598" X-IronPort-AV: E=Sophos;i="6.00,210,1681196400"; d="scan'208";a="335223598" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jun 2023 09:09:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10728"; a="777269663" X-IronPort-AV: E=Sophos;i="6.00,210,1681196400"; d="scan'208";a="777269663" Received: from silpixa00401385.ir.intel.com ([10.237.214.11]) by fmsmga004.fm.intel.com with ESMTP; 01 Jun 2023 09:09:05 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , stable@dpdk.org Subject: [PATCH] eal: fix calling cleanup function twice Date: Thu, 1 Jun 2023 17:08:55 +0100 Message-Id: <20230601160855.119801-1-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org If an app calls rte_eal_cleanup() inside it's own code, then cleanup could be called a second time automatically when the app exits. While mostly harmless, we can avoid any potential issues by guaranteeing that cleanup only gets called once, in the same way that eal_init only ever gets called once. Note: This patch only touches Linux and FreeBSD. Windows EAL does not have run-once guard on the init function, so omitting it in the cleanup function. Fixes: aec9c13c5257 ("eal: add function to release internal resources") Cc: stable@dpdk.org Signed-off-by: Bruce Richardson --- lib/eal/common/eal_common_debug.c | 4 +++- lib/eal/freebsd/eal.c | 10 ++++++++++ lib/eal/linux/eal.c | 10 ++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/eal/common/eal_common_debug.c b/lib/eal/common/eal_common_debug.c index dcb554af1e..9cac9c6390 100644 --- a/lib/eal/common/eal_common_debug.c +++ b/lib/eal/common/eal_common_debug.c @@ -4,10 +4,12 @@ #include #include +#include #include #include #include +#include void __rte_panic(const char *funcname, const char *format, ...) @@ -39,7 +41,7 @@ rte_exit(int exit_code, const char *format, ...) rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap); va_end(ap); - if (rte_eal_cleanup() != 0) + if (rte_eal_cleanup() != 0 && rte_errno != EALREADY) RTE_LOG(CRIT, EAL, "EAL could not release all resources\n"); exit(exit_code); diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index f125a0d3de..a2ce188c83 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -898,6 +898,16 @@ rte_eal_init(int argc, char **argv) int rte_eal_cleanup(void) { + static uint32_t run_once; + uint32_t has_run = 0; + + if (!__atomic_compare_exchange_n(&run_once, &has_run, 1, 0, + __ATOMIC_RELAXED, __ATOMIC_RELAXED)) { + RTE_LOG(WARNING, EAL, "Already called cleanup\n"); + rte_errno = EALREADY; + return -1; + } + struct internal_config *internal_conf = eal_get_internal_configuration(); rte_service_finalize(); diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index c80647d6b2..f8d66b9b6d 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1361,6 +1361,16 @@ mark_freeable(const struct rte_memseg_list *msl, const struct rte_memseg *ms, int rte_eal_cleanup(void) { + static uint32_t run_once; + uint32_t has_run = 0; + + if (!__atomic_compare_exchange_n(&run_once, &has_run, 1, 0, + __ATOMIC_RELAXED, __ATOMIC_RELAXED)) { + RTE_LOG(WARNING, EAL, "Already called cleanup\n"); + rte_errno = EALREADY; + return -1; + } + /* if we're in a primary process, we need to mark hugepages as freeable * so that finalization can release them back to the system. */ -- 2.39.2