From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 31369C021B8 for ; Tue, 4 Mar 2025 21:13:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A9B686B0085; Tue, 4 Mar 2025 16:13:22 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A4BB36B0088; Tue, 4 Mar 2025 16:13:22 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 912EF6B0089; Tue, 4 Mar 2025 16:13:22 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 72FE16B0085 for ; Tue, 4 Mar 2025 16:13:22 -0500 (EST) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 1D228C0630 for ; Tue, 4 Mar 2025 21:13:22 +0000 (UTC) X-FDA: 83185119444.17.C2B5571 Received: from mail.alien8.de (mail.alien8.de [65.109.113.108]) by imf17.hostedemail.com (Postfix) with ESMTP id 004D340004 for ; Tue, 4 Mar 2025 21:13:19 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=alien8.de header.s=alien8 header.b=eRif0Ako; spf=pass (imf17.hostedemail.com: domain of bp@alien8.de designates 65.109.113.108 as permitted sender) smtp.mailfrom=bp@alien8.de; dmarc=pass (policy=none) header.from=alien8.de ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741122800; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=LdcTYFTwyxAe0GTULnC1Hf3ftMeeyMOzsLoDFCVxUvI=; b=S3AMLC+0eeJHPBOYss2t2yRI1WpdIzku5jUNksL8+Y1/a86ZTPxn72/HtNxOZsW2pVF1bq 23+s9QkayKdSLoju2oB2SmWqWaKgMQp85HqmbsFRNADiA6eAuKQ9QhpzaMTwt9RlIS4B0m IuBuRk0v4ICGcu1A++uS/qhuG/QwkyM= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741122800; a=rsa-sha256; cv=none; b=UVXWwBKXaHusCDvN+vJiXExGXNUY68/w/yeAqjUmJh9kOmnJC7fJWC8IPv8n2FVAITMh4R H2KXAiXkLAYxcbo5k2wvAeoSYPqxZA0r40zdsl+59Ib+cgWqJiUHDI4rJam1yjRWKI7LDC /UIi4apHMFPJQLDLi4GAANPFiD/Dbu0= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=alien8.de header.s=alien8 header.b=eRif0Ako; spf=pass (imf17.hostedemail.com: domain of bp@alien8.de designates 65.109.113.108 as permitted sender) smtp.mailfrom=bp@alien8.de; dmarc=pass (policy=none) header.from=alien8.de Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.alien8.de (SuperMail on ZX Spectrum 128k) with ESMTP id 05F7E40E0202; Tue, 4 Mar 2025 21:13:17 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at mail.alien8.de Received: from mail.alien8.de ([127.0.0.1]) by localhost (mail.alien8.de [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id aLboqJJ2XNmr; Tue, 4 Mar 2025 21:13:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alien8.de; s=alien8; t=1741122791; bh=LdcTYFTwyxAe0GTULnC1Hf3ftMeeyMOzsLoDFCVxUvI=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=eRif0AkobBlshUnkYnyAxHfz3/LiY9xn44cegODjZ8eneK3mlVCMp20IUquamBbZk xHPgq8mI2ciE8K5jPYcoXECz3Y/CBzexDk3+rD1cDk8p8EusF3S+82WZJ+PZtPGqnc 9gD8OnD2m7bg52fC6+aLWVGCE6NpBHFuP0/Q1yFUTxatM/YkTIcIMKLCyc1IQs8Y9o pQrdCoYwyq/At4tUkkirdXvpa90K5gui8MW/7G/m1w9v5WjOH7gyViGLF6XAXALOCQ G+/uepIEzIKGePlN0d8JZaDa6oErHD05ppN5eSNfn93IHtjWu0QFgW3pj62S36EG5S TfX0CPPFSi7KcIy0JgMcq8aojRDmVw2DaGfUAFBsNHIpEsRlm5O0sfWCdookDgWNjH EPACJIoSwHvpa0e5Nxcho24xV2Ea2LwEPKCHnVhIGth9Vz0S+DOtaKbKhznlj25ucg HlcZ7vojtBTM0Bu07SGY5Lbhdr/Y2Jy2emha0tyPNCbZ4b1YAqU+2EtMlKEFoZCP+l JayZFadjUGeeHx37yACs7neRmKdxGUgqZ6X+lDnRgVH8+L7k81hzfje6nd5IFEPfN9 Rzbnau/7P8Ut1gLQbjQGzlTHTbMCt5Dbzqc4xdJN8ScBiJv4j8Z5haCI4X2PnT+vGv ZKGuWIB1GUZ2334z6qV33UYY= Received: from zn.tnic (pd95303ce.dip0.t-ipconnect.de [217.83.3.206]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail.alien8.de (SuperMail on ZX Spectrum 128k) with ESMTPSA id 3B3E540E015D; Tue, 4 Mar 2025 21:12:53 +0000 (UTC) Date: Tue, 4 Mar 2025 22:12:45 +0100 From: Borislav Petkov To: Dave Hansen Cc: Rik van Riel , x86@kernel.org, linux-kernel@vger.kernel.org, peterz@infradead.org, dave.hansen@linux.intel.com, zhengqi.arch@bytedance.com, nadav.amit@gmail.com, thomas.lendacky@amd.com, kernel-team@meta.com, linux-mm@kvack.org, akpm@linux-foundation.org, jackmanb@google.com, jannh@google.com, mhklinux@outlook.com, andrew.cooper3@citrix.com, Manali.Shukla@amd.com, mingo@kernel.org Subject: Re: [PATCH v14 03/13] x86/mm: add INVLPGB support code Message-ID: <20250304211245.GJZ8dszTlbuRhxZ3To@fat_crate.local> References: <20250226030129.530345-1-riel@surriel.com> <20250226030129.530345-4-riel@surriel.com> <20250228194734.GGZ8IS1iFVpPzmEyYl@fat_crate.local> <30c721e0-338d-4172-989c-5226d584bcbc@intel.com> <34b80474-a309-493b-81e9-3a7d4de8a369@intel.com> <20250304110032.GEZ8bdUOg2WLUrhMcm@fat_crate.local> <20250304161901.GCZ8cn9d252LTzThpI@fat_crate.local> <2efa96d5-b26a-4058-a353-5dd2180ed502@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <2efa96d5-b26a-4058-a353-5dd2180ed502@intel.com> X-Stat-Signature: 3f99k6uah1pez1sdi9qbhmrifo8ta5rf X-Rspamd-Queue-Id: 004D340004 X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1741122799-86221 X-HE-Meta: U2FsdGVkX18MxFjK/ijAnShMxD6iFOLf/mFd9BjJ0X0zlg0B2VZQMREEe6Re0NjXiBkTXMjZMTXwQAY2B6/Rv9kVyLoGh35Ap9/Bj+SNlfhzItv6tuPCv1Wnbp5/b+kx7QGx90Pj6RYbOdy9UAc2ZJLM+gyP+ci+nElHdZYk1RJ1krNao1yWy0PDxvnK42gNTrHDpi5bKGfCkC1txNGVptidhWruQl+yoe7sszdN1RU0VilazlzMsD8w3TMXh8O8xtMLTUi9dbS74MToysYHPAIwXEpvm4f1ig4Jtj9i3wPMYPDRJbDloFskdbKKkpAGIF0chOfF2ENJxXBAOc/XxVfcizsjga0RBreNE8iFL5ZvGaieLSPBZ2lJbyYY2AhvnqRZZqLTn3ndGNIW/ePKbRlwo54w6qSXlQ9KKHQkuWPeggQUZDuXnJ0+0jxoKwJOmJrqbA54FTjYzUG1ApFwYDJ19D8f3Er1yGVis/manmJANJrqLlbYtkMvj21+nOWDT3GnyE9LPqNMU6MPeXuv0e/e3dGIz/2Zk0gvwDXVvonmOtXl+8WgyAq4Y1eH0wGRSLcW3VAvc+yRhMiYo9VgSUAn73UPXdTFwz5nqVZ3/4MUUimIYTFUdILmW6kqv9KHPHp9ptZcpqi/qWW1c8wdqqyrFum7jGiriFW+9lOYG8ceSfKLjTT99uymrjbZ10t4kxCmFVFonRiG87DnJFbFTkDsdDCGRT9sLiaebiURXOURTXFYPKQq9VvnbIWtrPhTOwxXQGc2mYOdDcg+8hTC8Zz8sjfhS1hh23qxa0/LT0VDiJJ2KYTAF9ONvX6EXmbXdsVUpxEEAqlWrTdEnAdnSKJnKdyJ/Uda5JdiFDxNl+W/zkAa7nujxUNQ+wc9gElzhrKuB/Rgra3dfyWrt0mQZ5FVn3t870LjHHJF8ZulaaXy/tMEBlKCLCRh/KEqnEQSVPaAGYZvOrEa6WWFP/k fFvvXpI7 xJqzlwrqPFjJK6eldIcIj9Cqj6qLk8I4iv36P93isbQs/Ph/Oz4hge1ManDrh+ETiqCS8Xds5/D2tyqopEWarmscM5BWX3j3wS+6CYxczSwfN5WEcrYQJGo6JGeUTAx9nrnkgemK92qYRWIDS11aYEj5hETs3LsiL2V5UNbklE4ggQKukNyHr+hvdRE3sj3itqbRkj/m3VAKwg0vlRGDw0lE1ruCisVLIKLRk4cofXzvnN0qDUUDB8Ae5c9Ns3VX+8Bew6/kS5UR2xktaiCERbAEGzaFMB2Dpf8ho0xqA5aBoSXgzEybhFPh6C3uYwqgxiuWN4GuT/qK5Y5JNWI1PPw4jhw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, Mar 04, 2025 at 08:57:30AM -0800, Dave Hansen wrote: > Why would __invlpg_all() need an 'addr' or 'nr_pages'? Shouldn't those be 0? Yap, good idea. It makes the _all helper even better: static inline void __invlpgb_all(unsigned long asid, unsigned long pcid, u8 flags) { __invlpgb(asid, pcid, 0, 1, 0, flags); } > It's _better_ of course when it happens at a single site and it's close > to a prototype for __invlpgb(). But it's still a magic '0' that it's > impossible to make sense of without looking at the prototype. Yes. > Looking at the APM again... there really are three possible values for > ECX[31]: > > 0: increment by 4k > 1: increment by 2M > X: Don't care, no increment is going to happen > > What you wrote above could actually be written: > > __invlpgb(asid, pcid, addr, nr_pages, 1, flags); > > so the 0/1 is _actually_ completely random and arbitrary as far as the > spec goes. Yes. > Why does it matter? > > It enables you to do sanity checking. For example, we could actually > enforce a rule that "no stride" can't be paired with any of the > per-address invalidation characteristics: > > if (stride == NO_STRIDE) { > WARN_ON(flags & INVLPGB_FLAG_VA); > WARN_ON(addr); > WARN_ON(nr_pages); > } > > That's impossible if you pass a 'bool' in. > > But, honestly, I'm deep into nitpick mode here. I think differentiating > the three cases is worth it, but it's also not the hill I'm going to die > on. ;) Yap, and now I've massaged it so much so that it doesn't really need that checking. Because I have exactly two calls which use the stride: 1. static inline void __invlpgb_flush_user_nr_nosync(unsigned long pcid, unsigned long addr, u16 nr, bool stride) { enum addr_stride str = stride ? PMD_STRIDE : PTE_STRIDE; u8 flags = INVLPGB_FLAG_PCID | INVLPGB_FLAG_VA; __invlpgb(0, pcid, addr, nr, str, flags); } This one is fine - I verify it. 2. /* Flush addr, including globals, for all PCIDs. */ static inline void __invlpgb_flush_addr_nosync(unsigned long addr, u16 nr) { __invlpgb(0, 0, addr, nr, PTE_STRIDE, INVLPGB_FLAG_INCLUDE_GLOBAL); } This one controls it already. So the only case where something could go bad is when one would use __invlpgb() directly and that should hopefully be caught early enough. But if you really want, I could add sanitization to __invlpgb() to massage it into the right stride. And print a single warning - the big fat WARN* in an inline functions are probably too much. Hm, I dunno... Current diff ontop: diff --git a/arch/x86/include/asm/tlb.h b/arch/x86/include/asm/tlb.h index e8561a846754..8ab21487d6ee 100644 --- a/arch/x86/include/asm/tlb.h +++ b/arch/x86/include/asm/tlb.h @@ -66,6 +66,11 @@ static inline void __invlpgb(unsigned long asid, unsigned long pcid, asm volatile(".byte 0x0f, 0x01, 0xfe" :: "a" (rax), "c" (ecx), "d" (edx)); } +static inline void __invlpgb_all(unsigned long asid, unsigned long pcid, u8 flags) +{ + __invlpgb(asid, pcid, 0, 1, 0, flags); +} + static inline void __tlbsync(void) { /* @@ -84,6 +89,7 @@ static inline void __tlbsync(void) static inline void __invlpgb(unsigned long asid, unsigned long pcid, unsigned long addr, u16 nr_pages, enum addr_stride s, u8 flags) { } +static inline void __invlpgb_all(unsigned long asid, unsigned long pcid, u8 flags) { } static inline void __tlbsync(void) { } #endif @@ -121,7 +127,7 @@ static inline void __invlpgb_flush_user_nr_nosync(unsigned long pcid, /* Flush all mappings for a given PCID, not including globals. */ static inline void __invlpgb_flush_single_pcid_nosync(unsigned long pcid) { - __invlpgb(0, pcid, 0, 1, PTE_STRIDE, INVLPGB_FLAG_PCID); + __invlpgb_all(0, pcid, INVLPGB_FLAG_PCID); } /* Flush all mappings, including globals, for all PCIDs. */ @@ -134,7 +140,7 @@ static inline void invlpgb_flush_all(void) * as it is cheaper. */ guard(preempt)(); - __invlpgb(0, 0, 0, 1, PTE_STRIDE, INVLPGB_FLAG_INCLUDE_GLOBAL); + __invlpgb_all(0, 0, INVLPGB_FLAG_INCLUDE_GLOBAL); __tlbsync(); } @@ -148,7 +154,7 @@ static inline void __invlpgb_flush_addr_nosync(unsigned long addr, u16 nr) static inline void invlpgb_flush_all_nonglobals(void) { guard(preempt)(); - __invlpgb(0, 0, 0, 1, PTE_STRIDE, INVLPGB_MODE_ALL_NONGLOBALS); + __invlpgb_all(0, 0, INVLPGB_MODE_ALL_NONGLOBALS); __tlbsync(); } #endif /* _ASM_X86_TLB_H */ -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette