From patchwork Fri Feb 21 00:53:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13984675 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 7CE6EC021B4 for ; Fri, 21 Feb 2025 00:55:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 84CDC280007; Thu, 20 Feb 2025 19:55:09 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 6E86028000B; Thu, 20 Feb 2025 19:55:09 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4ED576B008A; Thu, 20 Feb 2025 19:55:09 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 23D856B00AC for ; Thu, 20 Feb 2025 19:55:09 -0500 (EST) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id C4063B0310 for ; Fri, 21 Feb 2025 00:55:08 +0000 (UTC) X-FDA: 83142132696.30.E129544 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf01.hostedemail.com (Postfix) with ESMTP id 4110A40009 for ; Fri, 21 Feb 2025 00:55:07 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=none; spf=pass (imf01.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740099307; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fp6wnG9ZVIwshrx2d7IT/TxCw+AbmdtrIYTrFxOaFoo=; b=5TmgLFvc/sMuR0Zbop4ftp5GpjFm8mIgoDfP6UCE/K7KB2amRC6DEp2JvVbSydjj7ZMD4J o3YvUnufq6FudeVMlv7AC6T4PFmUHbF+fV14Fx6A0cT5S7D//WZNMch4NDfk5+TUU2MdQJ DbhLAEJpWK7dzu3IyPQuGT2OrqYYCCU= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=none; spf=pass (imf01.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740099307; a=rsa-sha256; cv=none; b=gF+E6nnR2FOodxTqR331fqoaykqi1TECCyyU19rdst+nNXmWxcOGjTGp4rA0rfb2wrmv9p f21y6d97HQTpf9MJP3cf8S7rzkWPcwg98KWED46i0lOu18WvbRVdW8dXOt6z84B2kcolsL 9l9s7zqWQHLsqSZ+67k1F+Y8QdBeFAo= Received: from fangorn.home.surriel.com ([10.0.13.7]) by shelob.surriel.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tlHIZ-000000003Qf-26S8; Thu, 20 Feb 2025 19:53:47 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, bp@alien8.de, 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, Rik van Riel Subject: [PATCH v12 15/16] x86/mm: only invalidate final translations with INVLPGB Date: Thu, 20 Feb 2025 19:53:14 -0500 Message-ID: <20250221005345.2156760-16-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250221005345.2156760-1-riel@surriel.com> References: <20250221005345.2156760-1-riel@surriel.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 4110A40009 X-Stat-Signature: fq3tf1rdcu18yxwkkx1d64oiatou16re X-Rspamd-Server: rspam03 X-HE-Tag: 1740099307-142001 X-HE-Meta: U2FsdGVkX19AU6WZmrwR0rE0TnwCBMHnZKUwrpHS/hmPRUxNxTWSoLnxLK9TpurYqKaz0LE+A7ywalWaHp8cioeL/LS6a3sG/LaiWzHHVls+jbz5dbxBd8BIiab62LewetzU+Ll1b6XEA7X9sVtG2HF4NBFnnLq0SrRjMeZYAXCSXNX/eeV/fp2VlyIP9pdqwzv0L0k64e1PRZiGYNLygMk0vs4z/vdZ75qTOEBKkBNFOKjUN5VL0VzJDVB7CUPHHArgDXPefpZL9TzRi0KbQfBRHzdYps6dNaVPL0bM3NfLBFNuXiZjEWScfv/cls9d0hV63cVxAv4JHfEL+pXEGPpWi/KaO9jUTrmzFzEZnQ9tczSpFnW4TteA/J3I7nqt9LhGV9zMaQs7uA7/vKPr5C8UPy0Cr4dEUyhMS/kIy6ztIKqxSnnr5ZSgF/dEil6XCaoMB5r8bpoqWaECWzbm1K3Dxbzj7a875dobhdUFiwO7/5qKVEimbMy385YqvyGX/vy7/hsgk9qOEcMSho50HZbpJwjJqCZteLoMmDNX2dyEWwBsc6C54YsbPXHDgEwM2d4lmNVw7rq3SSQ4GZqxa9UQZOSfQJ7Xjfz0hodTnTYzSAwVHSRv4D3mkHV49ofbaVTDiXxa2+yR7qLuxvl2NgTe7O78E1VsVPEduurblYS87Kvp6EVtvZ5S3K6HayTNZfWHqpZQV7La9WainEpBDcNdrQk2Q7WyXWJ6nUz2FjxV9Lb2OTsOhtJ2BxYdtvQgzuz92fImDwReo3e5wBjgya2gw/3QL9NX9F46Wr5raQmHVjl2n3Ul+mypaecLbMwzAw0MYLNDbqP6mFTehKh9bcKtUxNTv3sAAOByflHjnbb3WAM978/10m++z5t+MUpbj/JJKQzp8ZvvqzLKqplswGvoDT8sf6LStfs6m4JBxDnU3dtDJSu47FvzCq+e+6OzJnGUDKI1e2OLuju/IcT u2N/yY7P +I870j+fwEE+Mqxu775WADTHubMS55rFHi6mFR+DUlokX2XvvFGOcs0at8GZI9lPlC6COIN3952psBGYB2MSd8jkhrv11SiCgCNhfI+HwBr1C22oeUqAfiA3JM0PXErLnW2U7PkZvcQGFYXJApVtMej/hWJcj2legeQoD4R8MMGb11+XymuPXPB9369G049XLgWROJCRHItzOnqIXk/T7zRVVAL60LoVWaO1/571fs6ydodOEdION7nbEJdPBMSvv73Y5HOS7t/O3Lk9vvZPuEf4HvgikSxshwNv/NQ+TE+cSGLYN4/OZOT9Jka4KNjyYQX0w++zZhP6Xj5WVnOSKEQpXA2XCd2wvQXe1YoXIF8bdVMTht1D4IvNIGbH17zZEaXNbhsvcjALRabuacGUm1J5T9Aj5uQGzus85UZaJl6+SANVDq4fsO6HwYJnmVcjOaneCdsPVlYbKsJM= 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: Use the INVLPGB_FINAL_ONLY flag when invalidating mappings with INVPLGB. This way only leaf mappings get removed from the TLB, leaving intermediate translations cached. On the (rare) occasions where we free page tables we do a full flush, ensuring intermediate translations get flushed from the TLB. Signed-off-by: Rik van Riel Tested-by: Manali Shukla Tested-by: Brendan Jackman Tested-by: Michael Kelley --- arch/x86/include/asm/tlb.h | 10 ++++++++-- arch/x86/mm/tlb.c | 13 +++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/tlb.h b/arch/x86/include/asm/tlb.h index f69b243683e1..b1a18fe30d9b 100644 --- a/arch/x86/include/asm/tlb.h +++ b/arch/x86/include/asm/tlb.h @@ -86,9 +86,15 @@ static inline void __tlbsync(void) static inline void __invlpgb_flush_user_nr_nosync(unsigned long pcid, unsigned long addr, u16 nr, - bool pmd_stride) + bool pmd_stride, + bool freed_tables) { - __invlpgb(0, pcid, addr, nr, pmd_stride, INVLPGB_PCID | INVLPGB_VA); + u8 flags = INVLPGB_PCID | INVLPGB_VA; + + if (!freed_tables) + flags |= INVLPGB_FINAL_ONLY; + + __invlpgb(0, pcid, addr, nr, pmd_stride, flags); } /* Flush all mappings for a given PCID, not including globals. */ diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 9ca22c504f82..8494d14d2fb7 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -495,9 +495,10 @@ static inline void tlbsync(void) static inline void invlpgb_flush_user_nr_nosync(unsigned long pcid, unsigned long addr, - u16 nr, bool pmd_stride) + u16 nr, bool pmd_stride, + bool freed_tables) { - __invlpgb_flush_user_nr_nosync(pcid, addr, nr, pmd_stride); + __invlpgb_flush_user_nr_nosync(pcid, addr, nr, pmd_stride, freed_tables); if (!this_cpu_read(cpu_tlbstate.need_tlbsync)) this_cpu_write(cpu_tlbstate.need_tlbsync, true); } @@ -540,9 +541,9 @@ static void broadcast_tlb_flush(struct flush_tlb_info *info) nr = clamp_val(nr, 1, invlpgb_count_max); } - invlpgb_flush_user_nr_nosync(kern_pcid(asid), addr, nr, pmd); + invlpgb_flush_user_nr_nosync(kern_pcid(asid), addr, nr, pmd, info->freed_tables); if (static_cpu_has(X86_FEATURE_PTI)) - invlpgb_flush_user_nr_nosync(user_pcid(asid), addr, nr, pmd); + invlpgb_flush_user_nr_nosync(user_pcid(asid), addr, nr, pmd, info->freed_tables); addr += nr << info->stride_shift; } while (addr < info->end); @@ -1696,10 +1697,10 @@ void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *batch, u16 asid = mm_global_asid(mm); if (asid) { - invlpgb_flush_user_nr_nosync(kern_pcid(asid), uaddr, 1, false); + invlpgb_flush_user_nr_nosync(kern_pcid(asid), uaddr, 1, false, false); /* Do any CPUs supporting INVLPGB need PTI? */ if (static_cpu_has(X86_FEATURE_PTI)) - invlpgb_flush_user_nr_nosync(user_pcid(asid), uaddr, 1, false); + invlpgb_flush_user_nr_nosync(user_pcid(asid), uaddr, 1, false, false); /* * Some CPUs might still be using a local ASID for this