From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 69108A04BB; Tue, 6 Oct 2020 11:32:23 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 149601E35; Tue, 6 Oct 2020 11:32:22 +0200 (CEST) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by dpdk.org (Postfix) with ESMTP id 9E686E07 for ; Tue, 6 Oct 2020 11:32:20 +0200 (CEST) Received: by mail-wm1-f66.google.com with SMTP id k18so2306396wmj.5 for ; Tue, 06 Oct 2020 02:32:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=Wt7dBVjS144hlCwMnl5COjDV9PxGqY2XnAJa/ltSP78=; b=csGuNHdWVwOKgJ2+0c3hsiJnB74h1g1/qvb7P7eABHYF1gTkG/hbuO21Hwj9HhsZGS E9/d/EqglJ9DQAShhEV1CScLsw1q+DeXQE3RuifpFTw5yRdGNrKnZUSdMlqojJWUquLV QUN1e7IeZ9QI1nvgMt6Ph74TjfjMgatzPx6+ToGMeQn+UUtjmpzU/Xue0/6X26jp88TH ki4jaK/PgCWzPn9oOaDMic6DIT4IXjD2a/Zc5QhmkUkpVxi+yvp5A4meBMI/xfCxv4mX whPuBkeb5M4XcTbOl8h9X6WquyCWeli7V+4kpYTOD+/v1cynXQiqjnkBJEnPA/kqzk2I pIaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=Wt7dBVjS144hlCwMnl5COjDV9PxGqY2XnAJa/ltSP78=; b=C8Py+K9gaEH1Cf6jiw/QYa4oHVLmdcgBoH9qgKlPmEdDTBZxUgfw6bcyyhXvjqb5x0 lz1tNOIgRG4qrgeVt0USFGlrL1qeLYbkLb6gbX0oCn3zuoxl2EPqbFZH0wYV6pknitEP ats5rF7kpTz2132W8cWi3BfIXUqnl/wekqG0zcf3VvjNS1rFwClgcYbfSWksVOttFmzM 6SLz2/eLp8/z9EvIuMh4EJ32dgsCc8l1ggv7HQnPxQH4G1PpsJAfIAXnxc4IcB7W2WZk 2KuQ1fdZVVw3n7rsCwZ4YV05kxfcBhTwxWIcSU/Bb29CRetGMc56T/AAp/8HYDaA6LuG tO9Q== X-Gm-Message-State: AOAM5313aNFYaF+exXWy+i0sNd3j01erOVyGA8SBn+OXcQKwwSo3vQmu QjzrjwOBTg9z47EEjtK5BaNSWQ== X-Google-Smtp-Source: ABdhPJxxLTT0aDjZHPGTg4KeqlJaHQZBv8fEyzNXtH0bebsmRe31m4UVMXxHBOVb/YKyQPem8z7qgg== X-Received: by 2002:a1c:5f46:: with SMTP id t67mr3682964wmb.173.1601976739271; Tue, 06 Oct 2020 02:32:19 -0700 (PDT) Received: from 6wind.com (2a01cb0c0005a600345636f7e65ed1a0.ipv6.abo.wanadoo.fr. [2a01:cb0c:5:a600:3456:36f7:e65e:d1a0]) by smtp.gmail.com with ESMTPSA id o194sm3244813wme.24.2020.10.06.02.32.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Oct 2020 02:32:18 -0700 (PDT) Date: Tue, 6 Oct 2020 11:32:17 +0200 From: Olivier Matz To: Ciara Power Cc: dev@dpdk.org, Ray Kinsella , Neil Horman Message-ID: <20201006093217.GG21395@platinum> References: <20200807155859.63888-1-ciara.power@intel.com> <20200930130415.11211-1-ciara.power@intel.com> <20200930130415.11211-2-ciara.power@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200930130415.11211-2-ciara.power@intel.com> User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [dpdk-dev] [PATCH v3 01/18] eal: add max SIMD bitwidth 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" Hi Ciara, Please find some comments below. On Wed, Sep 30, 2020 at 02:03:57PM +0100, Ciara Power wrote: > This patch adds a max SIMD bitwidth EAL configuration. The API allows > for an app to set this value. It can also be set using EAL argument > --force-max-simd-bitwidth, which will lock the value and override any > modifications made by the app. > > Signed-off-by: Ciara Power > > --- > v3: > - Added enum value to essentially disable using max SIMD to choose > paths, intended for use by ARM SVE. > - Fixed parsing bitwidth argument to return an error for values > greater than uint16_t. > v2: Added to Doxygen comment for API. > --- > lib/librte_eal/common/eal_common_options.c | 64 ++++++++++++++++++++++ > lib/librte_eal/common/eal_internal_cfg.h | 8 +++ > lib/librte_eal/common/eal_options.h | 2 + > lib/librte_eal/include/rte_eal.h | 33 +++++++++++ > lib/librte_eal/rte_eal_version.map | 4 ++ > 5 files changed, 111 insertions(+) > > diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c > index a5426e1234..e9117a96af 100644 > --- a/lib/librte_eal/common/eal_common_options.c > +++ b/lib/librte_eal/common/eal_common_options.c > @@ -102,6 +102,7 @@ eal_long_options[] = { > {OPT_MATCH_ALLOCATIONS, 0, NULL, OPT_MATCH_ALLOCATIONS_NUM}, > {OPT_TELEMETRY, 0, NULL, OPT_TELEMETRY_NUM }, > {OPT_NO_TELEMETRY, 0, NULL, OPT_NO_TELEMETRY_NUM }, > + {OPT_FORCE_MAX_SIMD_BITWIDTH, 1, NULL, OPT_FORCE_MAX_SIMD_BITWIDTH_NUM}, > {0, 0, NULL, 0 } > }; > > @@ -1309,6 +1310,34 @@ eal_parse_iova_mode(const char *name) > return 0; > } > > +static int > +eal_parse_simd_bitwidth(const char *arg, bool locked) > +{ > + char *end; > + unsigned long bitwidth; > + int ret; > + struct internal_config *internal_conf = > + eal_get_internal_configuration(); > + > + if (arg == NULL || arg[0] == '\0') > + return -1; > + > + errno = 0; > + bitwidth = strtoul(arg, &end, 0); > + > + /* check for errors */ > + if (bitwidth > UINT16_MAX || errno != 0 || end == NULL || *end != '\0') > + return -1; > + > + if (bitwidth == 0) > + bitwidth = UINT16_MAX; > + ret = rte_set_max_simd_bitwidth(bitwidth); > + if (ret < 0) > + return -1; > + internal_conf->max_simd_bitwidth.locked = locked; > + return 0; > +} > + > static int > eal_parse_base_virtaddr(const char *arg) > { > @@ -1707,6 +1736,13 @@ eal_parse_common_option(int opt, const char *optarg, > case OPT_NO_TELEMETRY_NUM: > conf->no_telemetry = 1; > break; > + case OPT_FORCE_MAX_SIMD_BITWIDTH_NUM: > + if (eal_parse_simd_bitwidth(optarg, 1) < 0) { > + RTE_LOG(ERR, EAL, "invalid parameter for --" > + OPT_FORCE_MAX_SIMD_BITWIDTH "\n"); > + return -1; > + } > + break; > > /* don't know what to do, leave this to caller */ > default: > @@ -1903,6 +1939,33 @@ eal_check_common_options(struct internal_config *internal_cfg) > return 0; > } > > +uint16_t > +rte_get_max_simd_bitwidth(void) > +{ > + const struct internal_config *internal_conf = > + eal_get_internal_configuration(); > + return internal_conf->max_simd_bitwidth.bitwidth; > +} Should the return value be enum rte_max_simd_t? If not, do we really need the enum definition? > + > +int > +rte_set_max_simd_bitwidth(uint16_t bitwidth) > +{ > + struct internal_config *internal_conf = > + eal_get_internal_configuration(); > + if (internal_conf->max_simd_bitwidth.locked) { > + RTE_LOG(NOTICE, EAL, "Cannot set max SIMD bitwidth - user runtime override enabled"); > + return -EPERM; > + } > + > + if (bitwidth != RTE_MAX_SIMD_DISABLE && (bitwidth < RTE_NO_SIMD || > + !rte_is_power_of_2(bitwidth))) { > + RTE_LOG(ERR, EAL, "Invalid bitwidth value!\n"); > + return -EINVAL; > + } > + internal_conf->max_simd_bitwidth.bitwidth = bitwidth; > + return 0; > +} Same question, should the parameter be enum rte_max_simd_t? > + > void > eal_common_usage(void) > { > @@ -1981,6 +2044,7 @@ eal_common_usage(void) > " --"OPT_BASE_VIRTADDR" Base virtual address\n" > " --"OPT_TELEMETRY" Enable telemetry support (on by default)\n" > " --"OPT_NO_TELEMETRY" Disable telemetry support\n" > + " --"OPT_FORCE_MAX_SIMD_BITWIDTH" Force the max SIMD bitwidth\n" > "\nEAL options for DEBUG use only:\n" > " --"OPT_HUGE_UNLINK" Unlink hugepage files after init\n" > " --"OPT_NO_HUGE" Use malloc instead of hugetlbfs\n" > diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h > index 13f93388a7..367e0cc19e 100644 > --- a/lib/librte_eal/common/eal_internal_cfg.h > +++ b/lib/librte_eal/common/eal_internal_cfg.h > @@ -33,6 +33,12 @@ struct hugepage_info { > int lock_descriptor; /**< file descriptor for hugepage dir */ > }; > > +struct simd_bitwidth { > + /**< flag indicating if bitwidth is locked from further modification */ > + bool locked; > + uint16_t bitwidth; /**< bitwidth value */ > +}; > + > /** > * internal configuration > */ > @@ -85,6 +91,8 @@ struct internal_config { > volatile unsigned int init_complete; > /**< indicates whether EAL has completed initialization */ > unsigned int no_telemetry; /**< true to disable Telemetry */ > + /** max simd bitwidth path to use */ > + struct simd_bitwidth max_simd_bitwidth; > }; > > void eal_reset_internal_config(struct internal_config *internal_cfg); > diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h > index 89769d48b4..ef33979664 100644 > --- a/lib/librte_eal/common/eal_options.h > +++ b/lib/librte_eal/common/eal_options.h > @@ -85,6 +85,8 @@ enum { > OPT_TELEMETRY_NUM, > #define OPT_NO_TELEMETRY "no-telemetry" > OPT_NO_TELEMETRY_NUM, > +#define OPT_FORCE_MAX_SIMD_BITWIDTH "force-max-simd-bitwidth" > + OPT_FORCE_MAX_SIMD_BITWIDTH_NUM, > OPT_LONG_MAX_NUM > }; > > diff --git a/lib/librte_eal/include/rte_eal.h b/lib/librte_eal/include/rte_eal.h > index ddcf6a2e7a..fb739f3474 100644 > --- a/lib/librte_eal/include/rte_eal.h > +++ b/lib/librte_eal/include/rte_eal.h > @@ -43,6 +43,14 @@ enum rte_proc_type_t { > RTE_PROC_INVALID > }; > > +enum rte_max_simd_t { > + RTE_NO_SIMD = 64, > + RTE_MAX_128_SIMD = 128, > + RTE_MAX_256_SIMD = 256, > + RTE_MAX_512_SIMD = 512, > + RTE_MAX_SIMD_DISABLE = UINT16_MAX, > +}; What is the difference between RTE_NO_SIMD and RTE_MAX_SIMD_DISABLE? The default value in internal_config is 0, so in my understanding rte_get_max_simd_bitwidth() will return 0 if --force-max-simd-bitwidth is not passed. Is it expected? Maybe I'm missing something, but I don't understand why the value in internal_config is not set to the maximum supported SIMD bitwidth by default, and optionally overriden by the command line argument, or by the API. > + > /** > * Get the process type in a multi-process setup > * > @@ -51,6 +59,31 @@ enum rte_proc_type_t { > */ > enum rte_proc_type_t rte_eal_process_type(void); > > +/** > + * Get the supported SIMD bitwidth. > + * > + * @return > + * uint16_t bitwidth. > + */ > +__rte_experimental > +uint16_t rte_get_max_simd_bitwidth(void); > + > +/** > + * Set the supported SIMD bitwidth. > + * This API should only be called once at initialization, before EAL init. > + * > + * @param bitwidth > + * uint16_t bitwidth. > + * @return > + * 0 on success. > + * @return > + * -EINVAL on invalid bitwidth parameter. > + * @return > + * -EPERM if bitwidth is locked. > + */ > +__rte_experimental > +int rte_set_max_simd_bitwidth(uint16_t bitwidth); > + > /** > * Request iopl privilege for all RPL. > * > diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map > index c32461c663..17a7195a3d 100644 > --- a/lib/librte_eal/rte_eal_version.map > +++ b/lib/librte_eal/rte_eal_version.map > @@ -397,6 +397,10 @@ EXPERIMENTAL { > rte_service_lcore_may_be_active; > rte_thread_register; > rte_thread_unregister; > + > + # added in 20.11 > + rte_get_max_simd_bitwidth; > + rte_set_max_simd_bitwidth; > }; > > INTERNAL { > -- > 2.17.1 >