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 67FC246B2B; Tue, 8 Jul 2025 19:21:27 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5616C40DDA; Tue, 8 Jul 2025 19:21:03 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.15]) by mails.dpdk.org (Postfix) with ESMTP id C0A6640DFD for ; Tue, 8 Jul 2025 19:21:00 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1751995261; x=1783531261; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=hNDXOm0FfS8hpROop1l0CPNtmTb2NEoRRKza+2TIw8o=; b=BT4v18oH6wwJ1FpfEcC+hSsxEW8+XjgsDD3HsljnmHXXvbCH4RsbvXXd VKTlHyKd80LA7AMS7VkGk6rv57Ppj2l7AL3zv1LlwxMW6q0ZDDJH29Wex wBkgzlFAk5R2SX8CYVneRPas9B7hEQMXbRI3qa75bXtVMVEVBnxE1T1Mn 7Ckf8HH0wv73PUVc/CceVFMDgdvkfnPvjOg0DkDV0MOT/CMwTKvKw6jFv wKyw74X+BpJzA2LkyxxEfkTHK5oLEPJLZcUxt1hGb+AdS8rwYXlcw0ze2 OFdaAQ2Z3A6451zB88u/9NveES+pkLB80vf//lvqiN5jpriPAe56YkEZh A==; X-CSE-ConnectionGUID: pTXJHGk2QrCHmbgferw5nA== X-CSE-MsgGUID: 7zCECuUfSkyELE8Vu28jUg== X-IronPort-AV: E=McAfee;i="6800,10657,11487"; a="57913151" X-IronPort-AV: E=Sophos;i="6.16,297,1744095600"; d="scan'208";a="57913151" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by orvoesa107.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2025 10:21:01 -0700 X-CSE-ConnectionGUID: hxO8+Ok3Qc63RiDtJ/pQsg== X-CSE-MsgGUID: 1DtQJJMSRX+CcKA/cKtN5w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,297,1744095600"; d="scan'208";a="161200645" Received: from silpixa00401874.ir.intel.com (HELO silpixa00401874.ger.corp.intel.com) ([10.55.129.54]) by orviesa005.jf.intel.com with ESMTP; 08 Jul 2025 10:20:59 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson Subject: [RFC PATCH v2 5/5] eal: simplify handling of conflicting cmdline options Date: Tue, 8 Jul 2025 17:20:39 +0000 Message-ID: <20250708172039.183989-6-bruce.richardson@intel.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250708172039.183989-1-bruce.richardson@intel.com> References: <20250520164025.2055721-1-bruce.richardson@intel.com> <20250708172039.183989-1-bruce.richardson@intel.com> 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 Use a utility function and macro to simplify the code for checking for conflicting cmdline options. The checking can also be done at the initial argument collating stage, shortening the argument processing function which is very much on the long side. Signed-off-by: Bruce Richardson --- lib/eal/common/eal_common_options.c | 119 +++++++++++----------------- 1 file changed, 47 insertions(+), 72 deletions(-) diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c index 87ab5a4f13..8c9502c3a6 100644 --- a/lib/eal/common/eal_common_options.c +++ b/lib/eal/common/eal_common_options.c @@ -238,6 +238,29 @@ struct rte_argparse eal_argparse = { } }; +static inline bool +conflicting_options(uintptr_t opt1, uintptr_t opt2, const char *opt1_name, const char *opt2_name) +{ + char name1[64]; /* should be the max length of any argument */ + char name2[64]; + + strlcpy(name1, opt1_name, sizeof(name1)); + strlcpy(name2, opt2_name, sizeof(name2)); + for (int i = 0; name1[i] != '\0'; i++) + if (name1[i] == '_') + name1[i] = '-'; + for (int i = 0; name2[i] != '\0'; i++) + if (name2[i] == '_') + name2[i] = '-'; + if (opt1 && opt2) { + EAL_LOG(ERR, "Options '%s' and '%s' can't be used at the same time", name1, name2); + return true; + } + return false; /* no conflicts */ +} +#define CONFLICTING_OPTIONS(args, opt1, opt2) \ + conflicting_options((uintptr_t)(args.opt1), (uintptr_t)(args.opt2), #opt1, #opt2) + /* function to call into argparse library to parse the passed argc/argv parameters * to the eal_init_args structure. */ @@ -260,6 +283,30 @@ eal_collate_args(int argc, char **argv) if (retval < 0) return retval; + /* check for conflicting options */ + /* both -a and -b cannot be used together (one list must be empty at least) */ + if (!TAILQ_EMPTY(&args.allow) && !TAILQ_EMPTY(&args.block)) { + EAL_LOG(ERR, "Options allow (-a) and block (-b) can't be used at the same time"); + return -1; + } + + /* for non-list args, we can just check for zero/null values using macro */ + if (CONFLICTING_OPTIONS(args, coremask, lcores) || + CONFLICTING_OPTIONS(args, service_coremask, service_corelist) || + CONFLICTING_OPTIONS(args, no_telemetry, telemetry) || + CONFLICTING_OPTIONS(args, memory_size, socket_mem) || + CONFLICTING_OPTIONS(args, no_huge, socket_mem) || + CONFLICTING_OPTIONS(args, no_huge, huge_worker_stack) || + CONFLICTING_OPTIONS(args, socket_limit, legacy_mem) || + CONFLICTING_OPTIONS(args, legacy_mem, in_memory) || + CONFLICTING_OPTIONS(args, legacy_mem, match_allocations) || + CONFLICTING_OPTIONS(args, no_huge, match_allocations) || + CONFLICTING_OPTIONS(args, no_huge, huge_unlink) || + CONFLICTING_OPTIONS(args, single_file_segments, huge_unlink) || + CONFLICTING_OPTIONS(args, no_huge, single_file_segments) || + CONFLICTING_OPTIONS(args, in_memory, huge_unlink)) + return -1; + argv[retval - 1] = argv[0]; return retval - 1; } @@ -1830,78 +1877,6 @@ eal_parse_args(void) struct rte_config *rte_cfg = rte_eal_get_configuration(); struct arg_list_elem *arg; - /* check for conflicting options */ - /* both -a and -b cannot be used together (one list must be empty at least) */ - if (!TAILQ_EMPTY(&args.allow) && !TAILQ_EMPTY(&args.block)) { - EAL_LOG(ERR, "Options allow (-a) and block (-b) can't be used at the same time"); - return -1; - } - /* both -l and -c cannot be used at the same time */ - if (args.coremask != NULL && args.lcores != NULL) { - EAL_LOG(ERR, "Options coremask (-c) and core list (-l) can't be used at the same time"); - return -1; - } - /* both -s and -S cannot be used at the same time */ - if (args.service_coremask != NULL && args.service_corelist != NULL) { - EAL_LOG(ERR, "Options service coremask (-s) and service core list (-S) can't be used at the same time"); - return -1; - } - /* can't have both telemetry and no-telemetry */ - if (args.no_telemetry && args.telemetry) { - EAL_LOG(ERR, "Options telemetry and no-telemetry can't be used at the same time"); - return -1; - } - /* can't have both -m and --socket-mem */ - if (args.memory_size != NULL && args.socket_mem != NULL) { - EAL_LOG(ERR, "Options -m and --socket-mem can't be used at the same time"); - return -1; - } - /* can't use both no-huge and socket-mem */ - if (args.no_huge && args.socket_mem) { - EAL_LOG(ERR, "Options --no-huge and --socket-mem can't be used at the same time"); - return -1; - } - /* can't use no-huge and huge-worker-stack */ - if (args.huge_worker_stack != NULL && args.no_huge) { - EAL_LOG(ERR, "Options --no-huge and --huge-worker-stack can't be used at the same time"); - return -1; - } - /* can't use socket-limit and legacy-mem */ - if (args.socket_limit != NULL && args.legacy_mem) { - EAL_LOG(ERR, "Options --socket-limit and --legacy-mem can't be used at the same time"); - return -1; - } - /* can't use legacy-mem and in-memory */ - if (args.legacy_mem && args.in_memory) { - EAL_LOG(ERR, "Options --legacy-mem and --in-memory can't be used at the same time"); - return -1; - } - /* can't use legacy-mem and match-allocations */ - if (args.legacy_mem && args.match_allocations) { - EAL_LOG(ERR, "Options --legacy-mem and --match-allocations can't be used at the same time"); - return -1; - } - /* can't use no-huge and match-allocations */ - if (args.no_huge && args.match_allocations) { - EAL_LOG(ERR, "Options --no-huge and --match-allocations can't be used at the same time"); - return -1; - } - /* can't use no-huge and huge-unlink */ - if (args.no_huge && args.huge_unlink) { - EAL_LOG(ERR, "Options --no-huge and --huge-unlink can't be used at the same time"); - return -1; - } - /* can't use single-file-segments and huge-unlink */ - if (args.single_file_segments && args.huge_unlink) { - EAL_LOG(ERR, "Options --single-file-segments and --huge-unlink can't be used at the same time"); - return -1; - } - /* can't use in-memory and huge-unlink */ - if (args.in_memory && args.huge_unlink) { - EAL_LOG(ERR, "Options --in-memory and --huge-unlink can't be used at the same time"); - return -1; - } - /* print version before anything else */ /* since message is explicitly requested by user, we write message * at highest log level so it can always be seen even if info or -- 2.48.1