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 CE393430D4; Wed, 23 Aug 2023 00:30:34 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D144941611; Wed, 23 Aug 2023 00:30:34 +0200 (CEST) Received: from forward501c.mail.yandex.net (forward501c.mail.yandex.net [178.154.239.209]) by mails.dpdk.org (Postfix) with ESMTP id CD2534021E for ; Wed, 23 Aug 2023 00:30:27 +0200 (CEST) Received: from mail-nwsmtp-smtp-production-main-81.myt.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-81.myt.yp-c.yandex.net [IPv6:2a02:6b8:c12:530c:0:640:7b0d:0]) by forward501c.mail.yandex.net (Yandex) with ESMTP id 135975EE6D; Wed, 23 Aug 2023 01:30:27 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-81.myt.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id NUSDBrtDaOs0-dHcl31mx; Wed, 23 Aug 2023 01:30:26 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1692743426; bh=ireLeBZHVUds9x/Vz7/MHYBxQb/rIa6yS7/0KFJUccs=; h=From:In-Reply-To:Cc:Date:References:To:Subject:Message-ID; b=LxoRvlnw5o5+9/6GOmdhAinFTOVTZVN/zM77L18y2yQ9UcZxss20R9XkqjytTnI2S KUnzsmKjRoh5I8jIBJyRS1snh2Dv86CW89Qp2pJ+TGxUNZ54Q6dUnKNsQcFvwtJjuL PcH80VcTZxVrZvEmpV2xAfZv2k+Lan+SrQ5ZnWQQ= Authentication-Results: mail-nwsmtp-smtp-production-main-81.myt.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Message-ID: Date: Tue, 22 Aug 2023 23:30:23 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Subject: Re: [PATCH v5 3/3] power: amd power monitor support Content-Language: en-US To: Bruce Richardson , Ferruh Yigit Cc: Konstantin Ananyev , "Tummala, Sivaprasad" , Tyler Retzlaff , "david.hunt@intel.com" , "anatoly.burakov@intel.com" , "david.marchand@redhat.com" , "thomas@monjalon.net" , "dev@dpdk.org" References: <20230418082529.544777-2-sivaprasad.tummala@amd.com> <20230816185959.1331336-1-sivaprasad.tummala@amd.com> <20230816185959.1331336-3-sivaprasad.tummala@amd.com> <20230816192758.GA12453@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> <92e7bd2e-b799-9658-c90e-f50638c6fdbd@amd.com> From: Konstantin Ananyev In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed 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 18/08/2023 14:48, Bruce Richardson пишет: > On Fri, Aug 18, 2023 at 02:25:14PM +0100, Ferruh Yigit wrote: >> On 8/17/2023 3:18 PM, Konstantin Ananyev wrote: >>> >>>>> Caution: This message originated from an External Source. Use proper caution >>>>> when opening attachments, clicking links, or responding. >>>>> >>>>> >>>>> On Wed, Aug 16, 2023 at 11:59:59AM -0700, Sivaprasad Tummala wrote: >>>>>> mwaitx allows EPYC processors to enter a implementation dependent >>>>>> power/performance optimized state (C1 state) for a specific period or >>>>>> until a store to the monitored address range. >>>>>> >>>>>> Signed-off-by: Sivaprasad Tummala >>>>>> Acked-by: Anatoly Burakov >>>>>> --- >>>>>> lib/eal/x86/rte_power_intrinsics.c | 77 >>>>>> +++++++++++++++++++++++++----- >>>>>> 1 file changed, 66 insertions(+), 11 deletions(-) >>>>>> >>>>>> diff --git a/lib/eal/x86/rte_power_intrinsics.c >>>>>> b/lib/eal/x86/rte_power_intrinsics.c >>>>>> index 6eb9e50807..b4754e17da 100644 >>>>>> --- a/lib/eal/x86/rte_power_intrinsics.c >>>>>> +++ b/lib/eal/x86/rte_power_intrinsics.c >>>>>> @@ -17,6 +17,60 @@ static struct power_wait_status { >>>>>> volatile void *monitor_addr; /**< NULL if not currently sleeping >>>>>> */ } __rte_cache_aligned wait_status[RTE_MAX_LCORE]; >>>>>> >>>>>> +/** >>>>>> + * These functions uses UMONITOR/UMWAIT instructions and will enter C0.2 >>>>> state. >>>>>> + * For more information about usage of these instructions, please >>>>>> +refer to >>>>>> + * Intel(R) 64 and IA-32 Architectures Software Developer's Manual. >>>>>> + */ >>>>>> +static void intel_umonitor(volatile void *addr) { >>>>>> + /* UMONITOR */ >>>>>> + asm volatile(".byte 0xf3, 0x0f, 0xae, 0xf7;" >>>>>> + : >>>>>> + : "D"(addr)); >>>>>> +} >>>>>> + >>>>>> +static void intel_umwait(const uint64_t timeout) { >>>>>> + const uint32_t tsc_l = (uint32_t)timeout; >>>>>> + const uint32_t tsc_h = (uint32_t)(timeout >> 32); >>>>>> + /* UMWAIT */ >>>>>> + asm volatile(".byte 0xf2, 0x0f, 0xae, 0xf7;" >>>>>> + : /* ignore rflags */ >>>>>> + : "D"(0), /* enter C0.2 */ >>>>>> + "a"(tsc_l), "d"(tsc_h)); } >>>>> >>>>> question and perhaps Anatoly Burakov can chime in with expertise. >>>>> >>>>> gcc/clang have built-in intrinsics for umonitor and umwait i believe as per our other >>>>> thread of discussion is there a benefit to also providing inline assembly over just >>>>> using the intrinsics? I understand that the intrinsics may not exist for the monitorx >>>>> and mwaitx below so it is probably necessary for amd. >>>>> >>>>> so the suggestion here is when they are available just use the intrinsics. >>>>> >>>>> thanks >>>>> >>>> The gcc built-in functions __builtin_ia32_monitorx()/__builtin_ia32_mwaitx are available only when -mmwaitx >>>> is used specific for AMD platforms. On generic builds, these built-ins are not available and hence inline >>>> assembly is required here. >>> >>> Ok... but we can probably put them into a separate .c file that will be compiled with that specific flag? >>> Same thing can be probably done for Intel specific instructions. >>> In general, I think it is much more preferable to use built-ins vs inline assembly >>> (if possible off-course). >>> >> >> We don't compile different set of files for AMD and Intel, but there are >> runtime checks, so putting into separate file is not much different. Well, we probably don't compile .c files for particular vendor, but we definitely do compile some .c files for particular ISA extensions. Let say there are files in lib/acl that requires various '-mavx512*' flags, same for other libs and PMDs. So still not clear to me why same approach can't be applied to power_instrincts.c? >> >> It may be an option to always enable compiler flag (-mmwaitx), I think >> it won't hurt other platforms but I am not sure about implications of >> this to other platforms (what was the motivation for the compiler guys >> to enable these build-ins with specific flag?). >> >> Also this requires detecting compiler that supports 'mmwaitx' or not, etc.. >> > This is the biggest reason why we have in the past added support for these > instructions via asm bytes rather than intrinsics. It takes a long time for > end-user compilers, especially those in LTS releases, to get the necessary > intrinsics. Yep, understand. But why then we can't have both implementations? Let say if WAITPKG is defined we can use builtins for umonitor/umwait/tpause, otherwise we fallback to inline asm implementation. Same story for MWAITX/monitorx. > Consider a user running e.g. RHEL 8, who wants to take > advantages of the latest DPDK features; they should not be required to > upgrade their compiler - and possibly binutils/assembler - to do so. > > /Bruce