From patchwork Mon Dec 30 17:53:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923399 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 794C7E77188 for ; Mon, 30 Dec 2024 17:57:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ECE846B009C; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id CFE546B00A1; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7CB866B00A5; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 2E2ED6B00A7 for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id DC95CA1451 for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952380518.03.1AD95A3 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf18.hostedemail.com (Postfix) with ESMTP id 15A341C0007 for ; Mon, 30 Dec 2024 17:57:11 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=none; spf=pass (imf18.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=1735581409; a=rsa-sha256; cv=none; b=aDh7zS9W5+fIg/qnM3rxggJzMjCmUUPUkH57Px0wGIlJURsKiREBHkHSyqIBWMlWje7bbi SooOEFlqYpP0bTWw9m+5WaV6ZTIEy7G9Und9aa7I7hse9ObMkiH1KLo/nilQNH/Bomlew2 BCBS1z3+690h2SUjtMdGXpvAH3Jfw98= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=none; spf=pass (imf18.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=1735581409; 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=gubB01sncxFro+ZwW5/gOVnSXZsx7A6xtmmdEMjV+d4=; b=PvU5eLic5qnTFmFuK5Bv3GSk6Wu4g/VA0/JoWucsYqayAYhg9vJxrI7EB5dxN8feGBjbRs wgfRSUJZWslVC6+nGCz5aDyXzcJYqBkwtkfRQLjY+0Y7aepCR3Aeix89kFGNp+dwVpLFbO 9EbsQv4nD9shaee3O8WUv6VzTTtD/ac= 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 1tSJzc-000000008Lf-2Fys; Mon, 30 Dec 2024 12:55:52 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 01/12] x86/mm: make MMU_GATHER_RCU_TABLE_FREE unconditional Date: Mon, 30 Dec 2024 12:53:02 -0500 Message-ID: <20241230175550.4046587-2-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 15A341C0007 X-Stat-Signature: 4sfkbgiqwwpxnkyryd377tjganiymcy7 X-Rspam-User: X-Rspamd-Server: rspam09 X-HE-Tag: 1735581431-796970 X-HE-Meta: U2FsdGVkX18x+oUKM2z3mLPnC9uGNpqIm4nh0rOdjrK3HhLdMc3gNr5/yBmoaHVuuncZjIOd65cWadjy9X5YHaqwrFoObILlNTYiC4Esnwpn1teYgULrxY6j8beQbbUR8pU7lrhb72rNpB9NM5L85NgUmtVNIKbNx4436I8BsMuWR4U/BGIgyZ840Fs+5kmxyCsyawwmOhq840rJ1vaSecC6YELpEig9ZhC8R7xChAR4Os2yyT4U2DyqqqO0dLqzw1g+hGGZkWtMvzFxeG/GOmxb0U0FchnxB7gwKTCBfKuZGW8aM4jQly30hYEhVAHGbkys6KiiazG7tkcghRf0u5KKKIdlc3X/kCk2twdkMYFAPg8LFHgbwqeU5rybPNQpR40fIQUYKvbL//NqyRcDKjkobljthjFUIyAmrAnTQvPC6HZrm9z4wArtbBxlV6Ql5Qjc0pIz4k1u6IgZZBN4rRShLXpGmHjb0v/7SeGBZ9xIuHDaovXW5czAQi9lRpwK3B9IauV81lc8XOpWVtbCfazWEGykDBsa1MHjM6/APFLRv51RzknrsboAUxCT1TQ28WexOTtezw95X29tVhDSpVfj+XClX7LqScHFgtfmv5LEzC6Q6nNg4NO9+PgNntvVQWFEPPacfjGH2IABG1Mf8Fxck1A+4yMI7LTer3mWPbslj5BP87FWtJBns90fmHQG/Mtjsw/BLoADA4sX0NiDL1ppVaU0z6PJ893FDCLV/s1fpnFqkFKCmrhHO+ks23a+t2Zf0sUozX/yOK9KorenM79ME5H8+Kalzhn6R7q1QI8YWfqunsmd10kW7YW6Wd8XKhyDXiNuWQBReazHuLzF23X7Ihu4BctX2Eoh9j90SS8QgZ2ILOAr5snz51dN+N5KemIg5K2mL6PeFppt331WHI2vzqhQ3mW8fJi8LOqbNY6sgfKgCuAmj3v2JoOLCEe7x1ORQ+nA0EUubo3zirf DF0jPvMU KAPg+6BlgnA2P6YGsGzc3FM0FBWk5eDtJsVEOsdbx1RkqLTCvslJXgIxqapw3uU303efuECoqJ7FTkYtzyPWQGR0pFBGsrsihmg7GOE8h3LwRDJo2Of5UitNWn+d1UHSIXQvDnTUGzbVoE+KC/AYIkVpmb/8rgjfI79mx+pA674LddHK1DY/U4MBju+Kcar7li+7+P/ES5Dl96QGQiK2GeBIE49dXyIDUH2q1v416mTZ9xjGnXM4amSgoFjPTotyX3bwbQvapyRQxxm4pUoA3FJ6v/Mf5MDRGCMYSTqqeMD13JwGvpxIg7uEHL/iXZNLUnoQ0eWJW3oTpRSY5c4qHioU8JFRnLlrvzpWbWknwMDHi4XBf07ZdPcBYz9uECmX1ff4kKMjhHL5g1RAUGiwqEtTeooB13bXAi1g7xNm5utInbUcJQBKnW+u1aASAlMeKUqusPeb8YYEXxwFG937yK6nk9/pFbka89BBasY3Qgj2IUEL/vjqx1/FHGA== 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: Currently x86 uses CONFIG_MMU_GATHER_TABLE_FREE when using paravirt, and not when running on bare metal. There is no real good reason to do things differently for each setup. Make them all the same. After this change, the synchronization between get_user_pages_fast and page table freeing is handled by RCU, which prevents page tables from being reused for other data while get_user_pages_fast is walking them. This allows us to invalidate page tables while other CPUs have interrupts disabled. Signed-off-by: Rik van Riel Suggested-by: Peter Zijlstra --- arch/x86/Kconfig | 2 +- arch/x86/kernel/paravirt.c | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 9d7bd0ae48c4..e8743f8c9fd0 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -274,7 +274,7 @@ config X86 select HAVE_PCI select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP - select MMU_GATHER_RCU_TABLE_FREE if PARAVIRT + select MMU_GATHER_RCU_TABLE_FREE select MMU_GATHER_MERGE_VMAS select HAVE_POSIX_CPU_TIMERS_TASK_WORK select HAVE_REGS_AND_STACK_ACCESS_API diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index fec381533555..2b78a6b466ed 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c @@ -59,11 +59,6 @@ void __init native_pv_lock_init(void) static_branch_enable(&virt_spin_lock_key); } -static void native_tlb_remove_table(struct mmu_gather *tlb, void *table) -{ - tlb_remove_page(tlb, table); -} - struct static_key paravirt_steal_enabled; struct static_key paravirt_steal_rq_enabled; @@ -191,7 +186,7 @@ struct paravirt_patch_template pv_ops = { .mmu.flush_tlb_kernel = native_flush_tlb_global, .mmu.flush_tlb_one_user = native_flush_tlb_one_user, .mmu.flush_tlb_multi = native_flush_tlb_multi, - .mmu.tlb_remove_table = native_tlb_remove_table, + .mmu.tlb_remove_table = tlb_remove_table, .mmu.exit_mmap = paravirt_nop, .mmu.notify_page_enc_status_changed = paravirt_nop, From patchwork Mon Dec 30 17:53:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923402 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 48397E77188 for ; Mon, 30 Dec 2024 17:57:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 88ECB6B00A9; Mon, 30 Dec 2024 12:57:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 585EC6B009E; Mon, 30 Dec 2024 12:57:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E346D6B00A5; Mon, 30 Dec 2024 12:57:35 -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 51F936B00AA for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id EBBAC8080F for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952381442.24.D01B3DC Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf11.hostedemail.com (Postfix) with ESMTP id 44E0E40012 for ; Mon, 30 Dec 2024 17:56:50 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf11.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581409; a=rsa-sha256; cv=none; b=DM4Z7QDv2URvskbyTMfgwHjBgo3zH1S2MKB1pVIv3tjqqmx9NpxflcEqJkIquXfeMzgmFK olbu/Zp1jNyQ9098Su0cc5Z+u6bRunEG7ghGcsQXHKCpvkBQJO1vmAeanJn2RKpHNKoMSI MG8pJTNLPryhzaU+nCNeTLeC7vsHwF0= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf11.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581409; 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=dHsoEyJZ5XLC7JY7dTW5E1So6h81yzYLCyPTrStsqgs=; b=hYOaqm0ZRkEwY74aTk7r4C/zFQecOwOAyp6YnY5XQqY2gyWwbX45S29Nc7g2ZZI8Ii/Uib AH0urqZd1K8hmNboAIRUaLDNMfgLj0KvcZZNgDUZfCvlnIDH1DVobnStn4YQosNbcLldRR zPs7lGmXvrVS1WZkU63qPeVkJX3UYes= 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 1tSJzc-000000008Lf-37RI; Mon, 30 Dec 2024 12:55:52 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 02/12] x86/mm: remove pv_ops.mmu.tlb_remove_table call Date: Mon, 30 Dec 2024 12:53:03 -0500 Message-ID: <20241230175550.4046587-3-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Stat-Signature: 7taabjqw5gw1ojh4upcjhbmyarfc4su7 X-Rspam-User: X-Rspamd-Queue-Id: 44E0E40012 X-Rspamd-Server: rspam08 X-HE-Tag: 1735581410-558139 X-HE-Meta: U2FsdGVkX19lyF33rC0+IMA03fQMggh4jAaqWUDTDcVtTABcCGGetn26CkqelkaUyK5SxZb28Oz8YYA/s9/TOlK6dPPne3K0RJofgTu86gDv617X7LvBg6cXv94GlD7davPVHnIIAGXxKRs/uKtRetrzwSF26Pk8XnLN4ERhpXnHZGQw1Q9q2sevwbB918W6YrWC4oUkyRR4c4TyKpPxv2BEwjBfnroNWig2YeTmBEwD75J9nGKOISJYRTJq/BESN7YN0LSqGkxcqp9B+uZeFipMYCO6chdtSnmeDFRLl/hA9Ys0Cx0AXpewCMPSVbLEruhUJ85m+I7EPw0/oTh/mGjXwFmpzXolh7FeYVeY/bjV+jFT5Xp94BJ0D+DHfn2PJNckW2YD3xJiq6znWPz8CtOlPlSlldwUmCyGIANy9O8+z9t69uJH7APo3QA1if/U90kgP0RMRkT6ySeh250bsw6mzgVJ29ZwyByy/0ynzscpvxHjtwDsmDwcHE+2+HRzui71cySXYrdhmFRxpdylnfMJNH7aec1HmMZxlyF1SGCxokGAnkfZLE1zBCXpIkBpvtReXttQVEyLr/BvLufbtfyZtBQsX1bs5VYTFZZaUHe6ai3Vvi18XaR0WhKXGfl1IcjjPHbun/aaDPegddLDNI+cEBVxEF3NSo7tTpWCJzIaE88cUIRuEf3iqI5O6JvmadM0THLmHRkFnYj/QDzkfLrVI+zhHc6oVmff2oIMeBcSzSmRmjnrw3zI22gA7MzNw96RJy9MegWX72W9MHRRAhze3AOm1KSneK5ZYy9xYmrR4spfDllMuaZe5FzCbpNcOJXsn9lxRGUknAXQtQeMtWtnNjndPPJ8ztESO0N5QdTlfwH6hL24PQu4OQQ/bBex8Aerg5CU2P8wAuv5b9Nyaf1O0mU32BCMBcVsy2JdO1MZ1F4hOf8F3tSakFi8grfSpRhlKK6PXObyXzetMbA 3S0tRZ17 cdkgJvYmJbHAZub+tGr056OqlPMU9Z5gf7m9zlQ5MaAc8qIMTp08lau8oe264hdpwilZQsT4cdEG/4POxCgHWKxHoDqF7Bmp7vz2dkDm1wd8P1rlXUixL0LvdVGY2uP60KftjO2Ys/qouEp/NIi4Gq6Pb15bf5leZnGPym6Gqd8fZrA5AEPx4LfhhEEwQh1Nvqzg3Cx/NFXXh62SKVmxIagWVTL3mnXMqF3TDRJcRIn1WevQobKVCJpCyIEiAegRMzhiwKI2zZjxz8TUrXhYgE3js3vNXYLMblodBwJnPzQBWwJgO67ZvFkxq9eHIltYNA7iExXsePtwylkglg7PIB1cs2dkeYQUmSuSCLp8ocVTExbBp0rApi5iF7JfSLhSQVa22K78Zsx+kdw8LdSAzWU2mevhyiFsk7BgQwLsGL4i7QqonIWurxTlSWH9fXRfGZaowrp4JdBE1ej0= 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: Every pv_ops.mmu.tlb_remove_table call ends up calling tlb_remove_table. Get rid of the indirection by simply calling tlb_remove_table directly, and not going through the paravirt function pointers. Signed-off-by: Rik van Riel Suggested-by: Qi Zheng --- arch/x86/hyperv/mmu.c | 1 - arch/x86/include/asm/paravirt.h | 5 ----- arch/x86/include/asm/paravirt_types.h | 2 -- arch/x86/kernel/kvm.c | 1 - arch/x86/kernel/paravirt.c | 1 - arch/x86/mm/pgtable.c | 16 ++++------------ arch/x86/xen/mmu_pv.c | 1 - 7 files changed, 4 insertions(+), 23 deletions(-) diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c index 1cc113200ff5..cbe6c71e17c1 100644 --- a/arch/x86/hyperv/mmu.c +++ b/arch/x86/hyperv/mmu.c @@ -240,5 +240,4 @@ void hyperv_setup_mmu_ops(void) pr_info("Using hypercall for remote TLB flush\n"); pv_ops.mmu.flush_tlb_multi = hyperv_flush_tlb_multi; - pv_ops.mmu.tlb_remove_table = tlb_remove_table; } diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index d4eb9e1d61b8..794ba3647c6c 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -91,11 +91,6 @@ static inline void __flush_tlb_multi(const struct cpumask *cpumask, PVOP_VCALL2(mmu.flush_tlb_multi, cpumask, info); } -static inline void paravirt_tlb_remove_table(struct mmu_gather *tlb, void *table) -{ - PVOP_VCALL2(mmu.tlb_remove_table, tlb, table); -} - static inline void paravirt_arch_exit_mmap(struct mm_struct *mm) { PVOP_VCALL1(mmu.exit_mmap, mm); diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 8d4fbe1be489..13405959e4db 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -136,8 +136,6 @@ struct pv_mmu_ops { void (*flush_tlb_multi)(const struct cpumask *cpus, const struct flush_tlb_info *info); - void (*tlb_remove_table)(struct mmu_gather *tlb, void *table); - /* Hook for intercepting the destruction of an mm_struct. */ void (*exit_mmap)(struct mm_struct *mm); void (*notify_page_enc_status_changed)(unsigned long pfn, int npages, bool enc); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 7a422a6c5983..3be9b3342c67 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -838,7 +838,6 @@ static void __init kvm_guest_init(void) #ifdef CONFIG_SMP if (pv_tlb_flush_supported()) { pv_ops.mmu.flush_tlb_multi = kvm_flush_tlb_multi; - pv_ops.mmu.tlb_remove_table = tlb_remove_table; pr_info("KVM setup pv remote TLB flush\n"); } diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 2b78a6b466ed..c019771e0123 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c @@ -186,7 +186,6 @@ struct paravirt_patch_template pv_ops = { .mmu.flush_tlb_kernel = native_flush_tlb_global, .mmu.flush_tlb_one_user = native_flush_tlb_one_user, .mmu.flush_tlb_multi = native_flush_tlb_multi, - .mmu.tlb_remove_table = tlb_remove_table, .mmu.exit_mmap = paravirt_nop, .mmu.notify_page_enc_status_changed = paravirt_nop, diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 5745a354a241..3dc4af1f7868 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -18,14 +18,6 @@ EXPORT_SYMBOL(physical_mask); #define PGTABLE_HIGHMEM 0 #endif -#ifndef CONFIG_PARAVIRT -static inline -void paravirt_tlb_remove_table(struct mmu_gather *tlb, void *table) -{ - tlb_remove_page(tlb, table); -} -#endif - gfp_t __userpte_alloc_gfp = GFP_PGTABLE_USER | PGTABLE_HIGHMEM; pgtable_t pte_alloc_one(struct mm_struct *mm) @@ -54,7 +46,7 @@ void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte) { pagetable_pte_dtor(page_ptdesc(pte)); paravirt_release_pte(page_to_pfn(pte)); - paravirt_tlb_remove_table(tlb, pte); + tlb_remove_table(tlb, pte); } #if CONFIG_PGTABLE_LEVELS > 2 @@ -70,7 +62,7 @@ void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) tlb->need_flush_all = 1; #endif pagetable_pmd_dtor(ptdesc); - paravirt_tlb_remove_table(tlb, ptdesc_page(ptdesc)); + tlb_remove_table(tlb, ptdesc_page(ptdesc)); } #if CONFIG_PGTABLE_LEVELS > 3 @@ -80,14 +72,14 @@ void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud) pagetable_pud_dtor(ptdesc); paravirt_release_pud(__pa(pud) >> PAGE_SHIFT); - paravirt_tlb_remove_table(tlb, virt_to_page(pud)); + tlb_remove_table(tlb, virt_to_page(pud)); } #if CONFIG_PGTABLE_LEVELS > 4 void ___p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d) { paravirt_release_p4d(__pa(p4d) >> PAGE_SHIFT); - paravirt_tlb_remove_table(tlb, virt_to_page(p4d)); + tlb_remove_table(tlb, virt_to_page(p4d)); } #endif /* CONFIG_PGTABLE_LEVELS > 4 */ #endif /* CONFIG_PGTABLE_LEVELS > 3 */ diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c index 55a4996d0c04..041e17282af0 100644 --- a/arch/x86/xen/mmu_pv.c +++ b/arch/x86/xen/mmu_pv.c @@ -2137,7 +2137,6 @@ static const typeof(pv_ops) xen_mmu_ops __initconst = { .flush_tlb_kernel = xen_flush_tlb, .flush_tlb_one_user = xen_flush_tlb_one_user, .flush_tlb_multi = xen_flush_tlb_multi, - .tlb_remove_table = tlb_remove_table, .pgd_alloc = xen_pgd_alloc, .pgd_free = xen_pgd_free, From patchwork Mon Dec 30 17:53:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923398 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 15422E7718F for ; Mon, 30 Dec 2024 17:57:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B41356B00AC; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A655A6B00AD; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 58EBE6B00A8; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 2949A6B00A5 for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id CAA03C07FD for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952381904.11.0F19611 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf20.hostedemail.com (Postfix) with ESMTP id B29351C000B for ; Mon, 30 Dec 2024 17:56:44 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=none; spf=pass (imf20.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=1735581409; a=rsa-sha256; cv=none; b=6/sEYi4yKRYTeNC5y2dTDl8okxAzgGBVV86TBRDeGSlEJMJ/5SqGWJ/T6utMvvCCwne/ji qSoAlE8WWc/XugstCj+qyI6iym3EZQzR6eLg8lRXjDuO/XB66QeTS9lt13HpE+VMTg/Jgr CHZyycSKac17QkYqxMv8dMiqrp9Afk4= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=none; spf=pass (imf20.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=1735581409; 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=Vu+np97BEOhzxibTxU5s+5i0frH+GWBwAeJ+kY0b4kg=; b=G4xiqkJAvRmvr3N7e16zffOAnqiqMi3AyCqc3x9GACQKGIjOtL3FvRsJTlaGc63xh2lwhh 331PHF/SS8RNji3zkOVSjvxlQYR4zrxLg7g9g2kymNNJQ7yMBlHmynQjMcOssJFJ1VL/bQ nA6R7NE8SrpJFICRfVcp2wnepiteuVo= 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 1tSJzc-000000008Lf-41s8; Mon, 30 Dec 2024 12:55:52 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 03/12] x86/mm: add X86_FEATURE_INVLPGB definition. Date: Mon, 30 Dec 2024 12:53:04 -0500 Message-ID: <20241230175550.4046587-4-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: B29351C000B X-Stat-Signature: dzjzkwpfropfjcenpdbrwmmo9in8uqi6 X-Rspam-User: X-Rspamd-Server: rspam09 X-HE-Tag: 1735581404-60830 X-HE-Meta: U2FsdGVkX1+8uvhpLgvbvEkdCHgSTHhSamoMsqDz9nz8klY/YYvEW4T6j8Ssxfw2JrtzCfcSYZMHSjcP7VXDREdZMzuLG7T/lvAEy7dtYo6WxHHs2La/XTnJ8u4zAdCsTGqrQ55y6pelMA0xwx2XCVoq2OwICEzhl0LEL26UY5iSX3xRyrWni8KXpUGYgdw+cUcxvgRXgKGXr1VcRzxlAtdA34QHkTGXPW9ohgyvIyndSP42K9kwdmuc3WxlazP00ahtLaRr9RLyDqsBTHC9jinA8Gsq48L7uAxqrfMAkmtLe/c5qlAkXte2gtldIqpKYSzWeeNeumrTJzqjoPHooFHsCUWNThNVzOROkmrUKrbIOD8kVyyESmodxSb8ugTfTB9k3RCNjBEEHE4GdC0c3XBrw5BZBCjfF7Fp/V+wck/58WOswSZVFqmEVzNcpfbIAAQMHZaRkz9dzBJxfbDRlSPxU1gqajHv5TvDxQ2hmV6mbsaUfLymtxepVwTxNWBEybrgRO5JklaHy9MTmu4p7M00xvxDc1LVMAdBZfvdteQO5bL1TTFpexBJG6uULzK8fjYNVBbrc64x+UYnDg09iEkSjoap31TJAONDfa8/T2HWTl8AUTa9nDQ5Icmf+GWL3FROwWFi5Qx7sFIS/DCrbNU8cob0W/rjpEY+SjIONPLBVxpr4snR472Qee/3lhJEHTcVw5ebGfHDQvCMUp68gOMrAEbIvG/bQtpdYT5jXnuryrA85JBV1e2Rd30JJ/Gsi88FxOgF/ET1F0pqUYegl8ABSh8wMJHAcTTCNJurpAKyHlPvB3vnLKC2rtlXS4cnJGIWlg3A/u2kTR0Pr4+Sbc/AeAnUY9GQAeekPGu9MISTXoRHS6VwzxZ4rSLKlBsxMTvOPgxupHQ8ufluuKJXJvSs+ViTHM3eyFeCT7NTBb/IghJnKFbVocwNEdEwOv01td20AjJp3kFKQ0qgyxf D9SBI3fb N2iLPyihLohc+Kiw4FmlFIDyufCzdHGv6TrYblGMKdKjSdIDaJ+H8rrUkuAbE+8LGuEReqRNyjcrAUzmQDApHSwrZWCIqhSEPgim9L5mvAn6erAT/aiF41L5sPAHWAVJiJOnhlg+1whDYGq6qMnU4V7By/V1Ocp6fB0cEC7Qlh8HcYJYz1c+2k/sntkS9grrLmkB2ywE04WTPZrmdhlCLk2+Vkgumh5yPdFMahnPXdVuL6oeM493fQrrDQil/NAt46Z97asWP6egiaeGYpvyWRBA/e2SpiepVw2E8RtVBjT0XDEllM6ttKySeAC9Y7PUL44+P4/8331Aei+RNe3MG0OIfCeY+3uVvJ1h3c1qvVO4r2CfV6Qdgm95WtEdilOY/VJw8dgB2eJZFRzC/PjCD6V1tFBPq8790282RK/THRZvtHUcIFFOZlFVMVw== 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: Add the INVPLGB CPUID definition, allowing the kernel to recognize whether the CPU supports the INVLPGB instruction. Signed-off-by: Rik van Riel --- arch/x86/include/asm/cpufeatures.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index 17b6590748c0..b7209d6c3a5f 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -338,6 +338,7 @@ #define X86_FEATURE_CLZERO (13*32+ 0) /* "clzero" CLZERO instruction */ #define X86_FEATURE_IRPERF (13*32+ 1) /* "irperf" Instructions Retired Count */ #define X86_FEATURE_XSAVEERPTR (13*32+ 2) /* "xsaveerptr" Always save/restore FP error pointers */ +#define X86_FEATURE_INVLPGB (13*32+ 3) /* "invlpgb" INVLPGB instruction */ #define X86_FEATURE_RDPRU (13*32+ 4) /* "rdpru" Read processor register at user level */ #define X86_FEATURE_WBNOINVD (13*32+ 9) /* "wbnoinvd" WBNOINVD instruction */ #define X86_FEATURE_AMD_IBPB (13*32+12) /* Indirect Branch Prediction Barrier */ From patchwork Mon Dec 30 17:53:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923397 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 14033E77188 for ; Mon, 30 Dec 2024 17:57:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7D3116B00A7; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 77DA86B00AC; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4A01C6B00A9; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 1890F6B009C for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id C160B807FF for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952380056.09.12E69D7 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf10.hostedemail.com (Postfix) with ESMTP id BC448C0006 for ; Mon, 30 Dec 2024 17:57:12 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf10.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581409; a=rsa-sha256; cv=none; b=yJpezt/Vpkp1e4uPW9mb2gBdGAnCTQFcHW4neGdZFOIpsjxo0pO55py3DA8XTRjWLwS7Kq EIiVjt9k1A/BTx/QKP3WEJInWToHTwRmuIv2MxOYUdRf1ea6vh/pLfrY4CT/wL3hOhlRlT TbmxWGeSr+CFMgXiZ/tTQLtb3QqaF2A= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf10.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581409; 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=K5kAnA/uvhfX97xxy6j+hAoMn5CiM7bebUnd0IunxME=; b=rDFEVrcnxfJHw8dviK5cjxlln5xrrvxMUC0Tkm8wV/csvnoL9xKWVxvMEO1nMe4hN2+C2y OOLpeCJjLbXUz0kZibyQTgGUI3B9zb2sys3mi8fCeJlmwcZn+P25FVPB1jKguab06lUQDh f0qyzIkR9da1xiM8TBNi1pCkfBjXTfo= 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 1tSJzd-000000008Lf-0g30; Mon, 30 Dec 2024 12:55:53 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 04/12] x86/mm: get INVLPGB count max from CPUID Date: Mon, 30 Dec 2024 12:53:05 -0500 Message-ID: <20241230175550.4046587-5-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Stat-Signature: 6oeufewo3zzyjgykdzjk9f1hbfmzce8j X-Rspam-User: X-Rspamd-Queue-Id: BC448C0006 X-Rspamd-Server: rspam08 X-HE-Tag: 1735581432-319027 X-HE-Meta: U2FsdGVkX1+GbDmlJ3kKHV6dl/VeomorhQ/patzqi9ofMeVtQ81VvEbFIA3gnoksd2EnJyWryNENdbbPmKmyNDJ4Okct//E+omcr++xHb4bXD6s3ehWFhNiP4oFMB9kvxECiSnJZiXpYuJvpVYbgUsXoZE6JO4nZKNQ8RDEhjYgFzCumTFxqnk3eFf9YxrmOyjBNXuMCvP1PwRmxVZWYeuszcx9GTaBxJxtZTkbPe3JUFADG/+FaBinvSQM0QnzgpZjs3Y7a1ydrTlg2ToCBLBf7BNRAh0/axiDQyeshQTS9zVGtQBh7W0NnZ7yfHro0EU1HxK0kOvyAq4/r+lb9Kxs30UD4qEXoRPi4/1LnWloFHolhCzI+s0R8IOaRyeZ3FZ17LIX5HeYqALLoVLqdes30a165vW4iiO7ajna8m+kbCmG4Zp59GwyqQJYXVo77CKt2Lu4504mCryrU4IrXjKw4vbL2uLZOAkLskUlg+K5RAQ85JqWe6ACDFfOKlzWCFsaw34duEkHRBWxvk+OkiCtUF9DHfJ3F14e0d5ooPWj/rKjm5gyEKNEXadamLhPXfb4R9lZriibnMV13lSYo84HnjltXBJXYDJNDXzCNPql/hfL/jNjcLNo2APMhiMnPiM9+PNBJdMyAq4a9Iy1wNUF80C7l0cp8S03+DB2osHigHDp5dGUT+6JreagcsCvTAJ/U/O3t11j35tJCGj7F5NvJCmYIj//L4sEKtSXDWCF0kzwdhk4BRjX1z3XAX7nlFHd36QQmGN/3USu7CxOvKFLC0NcXtuynLq5HbB+N+9fXZ+vi2n2Cjv3T79Rz48HhDzLtJF07hUtf5xCtNeLjw0tv0gfUGTZd+Y/StU4Ap7rGGSZIHgsUdkhu5bYqWbYSf3SGoh/+W+9E62j6dB1HCA+MiDH4e0W3zqFLlnaQHNkUfAXXCVed9yXCWokYtBRmSmLAgkLUitQRkGmcFFl OEms3gEJ rmPoIXbT8yq8DW1+CIaBOsPFDiSJ23fDVrVfTk7fl/Se2duGLAGabo8xrDFhCHKIcpdwUbfJQLudpddtT8OZo7gvobhuhGFdWPNSHR06xjv6MdgOikWa1MNbzCqx0bsdC7GtMWDIE6d4IUwm2wsdH0c01iFzg4TVaAom4pqLCK6J/Mc/+s7vbpMNbL4rD4rOqHXSdE6e3sUsX4IayQdW/+X67cF+GjLlmM+XcLv4XbGJz/WGWIXUBaV9VrltiliVStvjdVYiiyZKx8RN05K+62q4zbVN/Wmlk69/8cSO9CnxhVxj9s0ryOcDvDafW8pcEo93birXMpTE7pDgf1Y3xXLcOwqhflaIy3YzbIuVzy/8lKsx9bpFfdlxebKR52l7xdSrd 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: The CPU advertises the maximum number of pages that can be shot down with one INVLPGB instruction in the CPUID data. Save that information for later use. Signed-off-by: Rik van Riel --- arch/x86/include/asm/tlbflush.h | 1 + arch/x86/kernel/cpu/amd.c | 8 ++++++++ arch/x86/kernel/setup.c | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 02fc2aa06e9e..7d1468a3967b 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -182,6 +182,7 @@ static inline void cr4_init_shadow(void) extern unsigned long mmu_cr4_features; extern u32 *trampoline_cr4_features; +extern u16 invlpgb_count_max; extern void initialize_tlbstate_and_flush(void); diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 79d2e17f6582..226b8fc64bfc 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -1135,6 +1135,14 @@ static void cpu_detect_tlb_amd(struct cpuinfo_x86 *c) tlb_lli_2m[ENTRIES] = eax & mask; tlb_lli_4m[ENTRIES] = tlb_lli_2m[ENTRIES] >> 1; + + if (c->extended_cpuid_level < 0x80000008) + return; + + cpuid(0x80000008, &eax, &ebx, &ecx, &edx); + + /* Max number of pages INVLPGB can invalidate in one shot */ + invlpgb_count_max = (edx & 0xffff) + 1; } static const struct cpu_dev amd_cpu_dev = { diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index f1fea506e20f..6c4d08f8f7b1 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -138,6 +138,10 @@ __visible unsigned long mmu_cr4_features __ro_after_init; __visible unsigned long mmu_cr4_features __ro_after_init = X86_CR4_PAE; #endif +#ifdef CONFIG_CPU_SUP_AMD +u16 invlpgb_count_max __ro_after_init; +#endif + #ifdef CONFIG_IMA static phys_addr_t ima_kexec_buffer_phys; static size_t ima_kexec_buffer_size; From patchwork Mon Dec 30 17:53:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923401 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 C91F4E77188 for ; Mon, 30 Dec 2024 17:57:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 61C406B00A5; Mon, 30 Dec 2024 12:57:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 3AE7D6B00A9; Mon, 30 Dec 2024 12:57:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B26876B00A8; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 502986B009C for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id F192516192C for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952381820.18.E99E730 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf19.hostedemail.com (Postfix) with ESMTP id BF46D1A000E for ; Mon, 30 Dec 2024 17:56:44 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=none; spf=pass (imf19.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=1735581431; 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=yRu48wDyQbjXodzZ0IQCHNm8zDJ9Qrsyu2zd3npGVTA=; b=d31dbJo4drcbIjL9HjjylCE8bILwfKZHRBfaV+X8QL21HvmQ8u8hAQX4hL6lltHIzOl7+6 htPk3AcJBiiZixV+HFC+k9WsgzUcd2eUndNZUwgVFdc/sRAYTHEdMDZBtWM5rGD+ak0H0O 5vTqmEmbGWMJji8yB6WLrCAy5jLzp9k= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581431; a=rsa-sha256; cv=none; b=gKwQO3Rqq0tICcCJQH5nfwl/cTVO9sLPwzJOxnuDO6GKDfgquO7gcJRhIexzy7Q4rUST0E Gr4evJz1XPhjPAVzam/kGGjgNfMrKHEnuFOIgmy5TPgbDsnLdPOVD8JhjB38uqgebU/BCK 3HE2/UYJrn6TN20DKn59gtsRVh/5dXU= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=none; spf=pass (imf19.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com; dmarc=none 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 1tSJzd-000000008Lf-2LNx; Mon, 30 Dec 2024 12:55:53 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 05/12] x86/mm: add INVLPGB support code Date: Mon, 30 Dec 2024 12:53:06 -0500 Message-ID: <20241230175550.4046587-6-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: BF46D1A000E X-Stat-Signature: frqpzga4n9b5ehjgo1a9xsc6ueuk4pny X-Rspam-User: X-HE-Tag: 1735581404-741269 X-HE-Meta: U2FsdGVkX1/4loqOeeWpoCatGApiYbAz8JbSvUnDweQ6c8iK54I7TDA+BFhNugnDJI8f6TVZCxI8gO+eOTRfBv2Rixuq/Nm9oByhP+4UBuICmk27wvkDQwRa51weAQcRvhm9asj0Q/DGaHSVA1ltFLVdkp2rU/2uFvsd4+IBv6VK9qWLLQG+eL2DAfhUI65wlb3T3tJ+paso5J+SxhrqaS0BGpFyu8chg8Uiekn29zi99Ly7OMrhvGhRlHSCBtZxBPf35TudN6JSyapROPV8U4N1xDm4IuuwGFkvsa3v0CX8EOQWE6TcaWYWggxp82VypRweLMmN5zlFTceVXm5+vkogFS5qOGDeONl8mt+Tl4dTPyRJn8xnHKZ6L1ziB9l8Hy7m81U9YG/uvkYxRtYCH0GZcK8emRWxL/RhnXcXuHLckizTEbTqLcwDVJwXsVIvvGAYI8I5YsXo9N7X/nXOw9j+XcwF/02W7Z3FY33LKtL4N6jSqPU7gYnRDGa5W48TUb9CWYShZtKMLFJtq0WlRtGXNygdXkZhSuNb+E8gu3te8JgUg72k+mThmM51DgcqbbcQV4rWlU4OiMUF6K+bsieiGKHzYc6uapVIaBmdFWs416JIHK5exQbvNyKZ9h8h3EkYKsU8MIBTXhmTEAi3GQ4uug4XRWXIkX9Q5LcnkUK3yb3q6j543qHI0yiwF4nVGehqCBdpAmAwlMDqVGZM4Oh8GodigBc1k/gfwcRAtP4dsOfZfBzqGzOufXXpeUevWMqruHhFkBAUcZD3MSBDJMGrXZ1jqGt5W4x1T2xe+wUgFtekgZh+tFk29LidEoe2JALmA08Z9aJaUvQ9aHvUKUrV/W9lpeTLeuo8Jj3iOc6T2jqpXQVZfiX6lDryDI20Wz5ea/lsFbec7PSTWg5l9acfT+bAID0T59JbU3bNnhfBSUoP5NCH54ltSLw++Sp9iPDFBlLiVY1C43Nas4L 5LHpSn6N RdtUNgLkCH60hMnn+x+kC1gin/YA1PGaqxTqdJ4mY5Zt9RvH+4CbxCoa1bbEhXM6tg8TDEJ2GRSO8QIG5wJxIK0nRYIaG74XAhZJjtc6EDQIA0iQ9S2LxZwej7p8UhBTlClSfK7oae9PqT8QvAmZiRnRd7DN9PUn+Yg+FV/yvVnGIdWjCIDqGCagsccF7+FQEuc8QLQcaPToY2wfnv2qlIRuz5cNleJtuQHkrnS1FbwgvHF5/VQRQRaH51MTFnZ5PiMwNizIoRvBFfAq0Rb2rfUco9bJQdn4Ae9mlCBZmyo0dZgtDBd2od5NNoN9AjggGtGh6kUUH49OGLvn8jfS5gncjWBRq89JhZE+94MWLN2vnqFaSWErS1lQd9cmDa3gA7pC8 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: Add invlpgb.h with the helper functions and definitions needed to use broadcast TLB invalidation on AMD EPYC 3 and newer CPUs. Signed-off-by: Rik van Riel --- arch/x86/include/asm/invlpgb.h | 93 +++++++++++++++++++++++++++++++++ arch/x86/include/asm/tlbflush.h | 1 + 2 files changed, 94 insertions(+) create mode 100644 arch/x86/include/asm/invlpgb.h diff --git a/arch/x86/include/asm/invlpgb.h b/arch/x86/include/asm/invlpgb.h new file mode 100644 index 000000000000..862775897a54 --- /dev/null +++ b/arch/x86/include/asm/invlpgb.h @@ -0,0 +1,93 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_X86_INVLPGB +#define _ASM_X86_INVLPGB + +#include + +/* + * INVLPGB does broadcast TLB invalidation across all the CPUs in the system. + * + * The INVLPGB instruction is weakly ordered, and a batch of invalidations can + * be done in a parallel fashion. + * + * TLBSYNC is used to ensure that pending INVLPGB invalidations initiated from + * this CPU have completed. + */ +static inline void __invlpgb(unsigned long asid, unsigned long pcid, unsigned long addr, + int extra_count, bool pmd_stride, unsigned long flags) +{ + u64 rax = addr | flags; + u32 ecx = (pmd_stride << 31) | extra_count; + u32 edx = (pcid << 16) | asid; + + asm volatile("invlpgb" : : "a" (rax), "c" (ecx), "d" (edx)); +} + +/* + * INVLPGB can be targeted by virtual address, PCID, ASID, or any combination + * of the three. For example: + * - INVLPGB_VA | INVLPGB_INCLUDE_GLOBAL: invalidate all TLB entries at the address + * - INVLPGB_PCID: invalidate all TLB entries matching the PCID + * + * The first can be used to invalidate (kernel) mappings at a particular + * address across all processes. + * + * The latter invalidates all TLB entries matching a PCID. + */ +#define INVLPGB_VA BIT(0) +#define INVLPGB_PCID BIT(1) +#define INVLPGB_ASID BIT(2) +#define INVLPGB_INCLUDE_GLOBAL BIT(3) +#define INVLPGB_FINAL_ONLY BIT(4) +#define INVLPGB_INCLUDE_NESTED BIT(5) + +/* Flush all mappings for a given pcid and addr, not including globals. */ +static inline void invlpgb_flush_user(unsigned long pcid, + unsigned long addr) +{ + __invlpgb(0, pcid, addr, 0, 0, INVLPGB_PCID | INVLPGB_VA); +} + +static inline void invlpgb_flush_user_nr(unsigned long pcid, unsigned long addr, + int nr, bool pmd_stride) +{ + __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID | INVLPGB_VA); +} + +/* Flush all mappings for a given ASID, not including globals. */ +static inline void invlpgb_flush_single_asid(unsigned long asid) +{ + __invlpgb(asid, 0, 0, 0, 0, INVLPGB_ASID); +} + +/* Flush all mappings for a given PCID, not including globals. */ +static inline void invlpgb_flush_single_pcid(unsigned long pcid) +{ + __invlpgb(0, pcid, 0, 0, 0, INVLPGB_PCID); +} + +/* Flush all mappings, including globals, for all PCIDs. */ +static inline void invlpgb_flush_all(void) +{ + __invlpgb(0, 0, 0, 0, 0, INVLPGB_INCLUDE_GLOBAL); +} + +/* Flush addr, including globals, for all PCIDs. */ +static inline void invlpgb_flush_addr(unsigned long addr, int nr) +{ + __invlpgb(0, 0, addr, nr - 1, 0, INVLPGB_INCLUDE_GLOBAL); +} + +/* Flush all mappings for all PCIDs except globals. */ +static inline void invlpgb_flush_all_nonglobals(void) +{ + __invlpgb(0, 0, 0, 0, 0, 0); +} + +/* Wait for INVLPGB originated by this CPU to complete. */ +static inline void tlbsync(void) +{ + asm volatile("tlbsync"); +} + +#endif /* _ASM_X86_INVLPGB */ diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 7d1468a3967b..20074f17fbcd 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include From patchwork Mon Dec 30 17:53:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923404 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 68133E7718F for ; Mon, 30 Dec 2024 17:58:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D40866B00A1; Mon, 30 Dec 2024 12:57:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A8D0A6B00AB; Mon, 30 Dec 2024 12:57:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3619E6B00A1; Mon, 30 Dec 2024 12:57:36 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 85C146B00A9 for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 2833C16192F for ; Mon, 30 Dec 2024 17:57:35 +0000 (UTC) X-FDA: 82952381946.04.A9C278F Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf27.hostedemail.com (Postfix) with ESMTP id 1846A40003 for ; Mon, 30 Dec 2024 17:56:42 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf27.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581398; 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=qpzsSMqzE1dtO59H1mvpeuDeXnr/EnNIUrW282zrREQ=; b=DHJPoc5davYlAuejRYoCmJ9E31MdDEZUr4jqVxmq4Twxvc5pQV2kDKIX4+nYY5b1TXDnL+ wh7LGJFjdnMumTN8D4NAGjcJJt3KpgTAkrajla1RhvqTKbxug+LC+S4ytYIOYaV9cgjoeB jKwZgMYx15rtoLNRk8ief/FSaPFSltU= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581398; a=rsa-sha256; cv=none; b=W+94Bdn3lZfAgwNRanA7d+CXIBFmT8eYWWOWgz4EVcyWWSm+PKtw5N5pKWWiv4IM+rcM2h rV+uBmVamjS0ku8xfoy3M0DNrq6jLdjPacNk+dNGBq/EbQPXfLlQI/X8pBP9PT2MS2q/3O iSIpI/Lh84dA3R6Yho7vu9/tDROnQ5U= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf27.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com 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 1tSJzd-000000008Lf-3fUp; Mon, 30 Dec 2024 12:55:53 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 06/12] x86/mm: use INVLPGB for kernel TLB flushes Date: Mon, 30 Dec 2024 12:53:07 -0500 Message-ID: <20241230175550.4046587-7-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 1846A40003 X-Rspam-User: X-Rspamd-Server: rspam07 X-Stat-Signature: e6u4iusr3a7dnf3ugt9jenjprb6shhux X-HE-Tag: 1735581402-52570 X-HE-Meta: U2FsdGVkX19WdIr+n44soUkJw4sfoEFRx0uDYOYK8tgWa7EPkOCM8efhrOCb06WUd03iKK3zaS+5q0q2/hG1YCm+QtXw9vA3GpYbDS9/DjIW8Dqlo0tKoQyQETiu05OMF6aaorZAiq378BInGpVkKzCTqjA0Rowslv7MDADfd5LDe2xGSUvrxhBwgftGBUj9gD+OGLmV/ZCWlcnWidGUrRHLEgFWBTTumhfl2Fnlg6mPGtGhMQHZNp+29VCSZRwxqB/xrEPPHVl5aQAmBFACwn7rObVThCRiughHh4gzHY8x096gbgO7SdjYITlobIELZuMl7/XxAeVClt/uILH7Uf4t7jgIzAYEmtB7T2RrFlX4+N0FwxNvYtbk1XRDra19KlShXMlLQSqC4LI23k7C9QM1zQsQ98VQe4uBdNFUSIcm6eq3jN4jRWBtLrICxvtSEerE7X9v2cHHOk0rX6sMsZos39msoqcIRGmxAccltK3J4HBhT9d8wOR9SHy4IO1+ZRsLXwAqR4ZfviqBJM8mNn7TFlacUdy0+bKnjnwtAWSZ6sHAyPlC0U7WcAafB0d4wMhsgzgqnOztFdfm8ET5rcXiJtV/J6/Va6FWpqBNWa8bKwzz27s29qdjaZx4pf8z5sTscrJiO/tebfT6eR7PeQMl3OFJfPx51ekvjbbjF6n1ykrRCdjMW0d1erUMBncz0CpY1PaKXQ4c2hXC6YHoDG00hdctro316zAfLb6vLP2eGp2LG2ljaf+113SS1AFXDAKJe/ZMQvDT099SKC+c/rmKmR2zcAVtCtC6+4bZAnSza3gEtGiOQzUur1PwqrfdTyBy1iQ1qY7OxiRGr2/rFUgfLsIrq/L4hZaKB86GJMwPRYfvWR+nwBWV3Igxuy1VB66CbZfPWAoM4PO1CUjWu2FOJmTIE57EzIUwn1690aiObQmKaeuSdZBgap6CfD8WiSMiF9ZQnNbr1ESF7vt cWIptAwI K+zJD6nHsRfCkjl34RJZp5mPOrotXBQal5ZxCij/yjVRnJplf+Y2GVrjV2/WwlhfI/FHhng0Vfhc2ZcET80P04ygEmtxPwYL/dNdaC07llTvuaUxHm6HRorvJEURY9+J4EB5TwQzxArjDVnPkg8PHL9RS7SYl4r4fQUMxlOmZUBFPYG7xre2IoPMnLOcXN/jUQHK8YNoH4exnWlVcMmi+8+NUSiby0HGWZz/HkGQLCCeA97/jAU8mdOviaizmzaa3iEoNu3QqFhQx76ENM2Y1yn+Q7oCrLOJNrn+12OBwqiB35WBDL1sq5HG8BZ/2tfAg7//zEk56n7mr4/XDfwTSW1UuOe/dJ5aGJYZh//0v1Dl3CNROQSrVXRSFqW4eRNjTaljm 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 broadcast TLB invalidation for kernel addresses when available. This stops us from having to send IPIs for kernel TLB flushes. Signed-off-by: Rik van Riel --- arch/x86/mm/tlb.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 6cf881a942bb..29207dc5b807 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -1077,6 +1077,32 @@ void flush_tlb_all(void) on_each_cpu(do_flush_tlb_all, NULL, 1); } +static void broadcast_kernel_range_flush(unsigned long start, unsigned long end) +{ + unsigned long addr; + unsigned long maxnr = invlpgb_count_max; + unsigned long threshold = tlb_single_page_flush_ceiling * maxnr; + + /* + * TLBSYNC only waits for flushes originating on the same CPU. + * Disabling migration allows us to wait on all flushes. + */ + guard(preempt)(); + + if (end == TLB_FLUSH_ALL || + (end - start) > threshold << PAGE_SHIFT) { + invlpgb_flush_all(); + } else { + unsigned long nr; + for (addr = start; addr < end; addr += nr << PAGE_SHIFT) { + nr = min((end - addr) >> PAGE_SHIFT, maxnr); + invlpgb_flush_addr(addr, nr); + } + } + + tlbsync(); +} + static void do_kernel_range_flush(void *info) { struct flush_tlb_info *f = info; @@ -1089,6 +1115,11 @@ static void do_kernel_range_flush(void *info) void flush_tlb_kernel_range(unsigned long start, unsigned long end) { + if (cpu_feature_enabled(X86_FEATURE_INVLPGB)) { + broadcast_kernel_range_flush(start, end); + return; + } + /* Balance as user space task's flush, a bit conservative */ if (end == TLB_FLUSH_ALL || (end - start) > tlb_single_page_flush_ceiling << PAGE_SHIFT) { From patchwork Mon Dec 30 17:53:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923392 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 8744DE77188 for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0524D8D0002; Mon, 30 Dec 2024 12:57:34 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 002B88D0001; Mon, 30 Dec 2024 12:57:33 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E0D4B8D0002; Mon, 30 Dec 2024 12:57:33 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id C22F28D0001 for ; Mon, 30 Dec 2024 12:57:33 -0500 (EST) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 6ED228079B for ; Mon, 30 Dec 2024 17:57:33 +0000 (UTC) X-FDA: 82952379510.17.73FD864 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf23.hostedemail.com (Postfix) with ESMTP id 89689140006 for ; Mon, 30 Dec 2024 17:57:00 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf23.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581416; 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=RvUG6h0MQaYHtg8Ef5p8DQpEw1lCdNoPeCNYGAwIr28=; b=VtCM0MvUmOn7412gUgdU1HUKfmlHUyEeBcyIM7rsEXpxEHQ6+q02Cv5aVTQXHcZc07e9ja pd7rV1RVYKhr9L1koxYVyzygVqZ20WnzlWjqskvM7XogRYwW9+S1VTp1u4wcQeDWZaqAS7 bPPJkqaZniOU9K0UBk+GgcqkZoQH/RU= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf23.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581416; a=rsa-sha256; cv=none; b=fvXNnMGB55EOQTZRDkxgC8FQtONCzPMPf1R0/P2n46ZWEBar3cWj82+CL7bUoc5xB0n544 9xXqUWB2Uiio0sZPdXjSyl8hu2wV/CP6YbHQ3EF4DcPKrxnhvxPqD1qMSfOVrHNdRpGYoz mOCabh7BQpO+2952MK78Yg7YmqyZKCc= 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 1tSJze-000000008Lf-0aOp; Mon, 30 Dec 2024 12:55:54 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 07/12] x86/tlb: use INVLPGB in flush_tlb_all Date: Mon, 30 Dec 2024 12:53:08 -0500 Message-ID: <20241230175550.4046587-8-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 89689140006 X-Rspamd-Server: rspam12 X-Stat-Signature: 6zxxwomuhzhp5ufuhnr5y31akdkf9gk7 X-Rspam-User: X-HE-Tag: 1735581420-58714 X-HE-Meta: U2FsdGVkX1/hwOhXgGZh8O+2RcetwKfRpr+6vI7oHpAAiReCXEU0Yw00ZB3+p//ddlBttKqHwlPbCYrLYCT1Sas7HLwrUGBq2OwZTpSnXyTjF9VIWVhD+iPUzwQI6HH1erueFIAPDWo2Aukx9DEqVencY29vQSMg4P1qJOAG1FU7aBnh2AkAGGN6gIaGPCqcN2rLiXJPO1uYkjdaaFA9gxQMEJiEAgNyyQHYVxInjb8U7Ys9t3hsusLKIqjy1BDgMUjzokOs16qxL7kh8yqdcFNgCpuTTFnlax+BGcMCdkZ3g/2PlDQNeR+iwHsWzQSaxDWvmM2vQnNatrtwSS7SwDTkY/gwiBpqvbCdT26kxGpGFA0vSgiNMerwgMGIsMwvlITH73OmWvtE5P3IpLiafAi6UDxjEf/DFLMh7O8UDCujkhjvBE+pH59EqS5NS1hW+0+trJHMCCnbnMAkkESfnK19QUHOICRCGQaKj88iSRChlkJK0J+75uRQYOVZZ1EOOYqCqAkT5fRDqdAgWPDdZQPjqyqVDA4NydWO40mkHojjv0vcDw94qr7bxfGRK2W0xvtHHIJyJG6BZCvPZv3eVP/zgifb6NskLMQ0b9GqymhzF5qfMhUnljFrq22Kw0EBQ5xn+ZUVaSMx+J5mhj/YiBtWFfO5P8/rhfbhyi2OVMMZKwLSuQbf1MysDz6b4JYpqA/0tHQMIq/smejXPseZZidzHg/77kvv84vMselH1tx8KRlt8wUC+QF5p9eVF4/tvvpJ1U6g4Tv05n7hNzjWrJRdXFkY3zJAQvAwW7XwPGukUXk9DI/f3ExHBJ3JO4ANWnwikSCsbDnb8XuPcggY4ADj3vH0VwKYcI/u4pcVkiHOlz7UFUQspJCgJhBKqBwakn7A4YDYleoquowVuqeGeoHL3QSmVObVRBrOCQoLCaZrxLyxW5Js+4Dl8YhxT7sx7N34I7yiv5ML3lJNcWd bS7eWVEV phUT/ogLmsQpCDiDbQrTQpMhMzlSWAyhqqj237P3dmkL0sMscM4OakG/IEazSGIi4zEaVoY0igQh2Z0la+KgmngaTfYfDbo7SI5rXTXWAfM2UDN+hD3vyu6GYh2HeAF/82Kq3t2l+plBbOW6rDt8dQfom+knrAhpK5teExYM5lMWRkIhHLAhTekNF6Ds2B4zj6cSEjoACOxtTgoZpnDb0n4PRp5kVMXi9XkugamchidaGImQ2yGM+hUOSjA2jEOc1cDv/I8oD2IeZUYbAl6eJMzRikGTv8+CJGIll7QmRtibv+K7v1Rea8iyO7zfm5qksHVrVTYtwErPLuReyDhdmG09goTSifJ9ZhZL9SiECNtmIweKbXydt4vfVjM5gh4gFt+3KOVPIfqbugNK+r+bNujfsv0mWPItSV6PCf+wL7QfUhiTEkXhW+tx1Ug== 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: The flush_tlb_all() function is not used a whole lot, but we might as well use broadcast TLB flushing there, too. Signed-off-by: Rik van Riel --- arch/x86/mm/tlb.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 29207dc5b807..266d5174fc7b 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -1074,6 +1074,12 @@ static void do_flush_tlb_all(void *info) void flush_tlb_all(void) { count_vm_tlb_event(NR_TLB_REMOTE_FLUSH); + if (cpu_feature_enabled(X86_FEATURE_INVLPGB)) { + guard(preempt)(); + invlpgb_flush_all(); + tlbsync(); + return; + } on_each_cpu(do_flush_tlb_all, NULL, 1); } From patchwork Mon Dec 30 17:53:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923400 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 A746DE77194 for ; Mon, 30 Dec 2024 17:57:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 38CB06B00A8; Mon, 30 Dec 2024 12:57:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 0F7116B00AE; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9C7846B00AB; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 246BC6B00A1 for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id DA394454EE for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952381778.05.3230846 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf16.hostedemail.com (Postfix) with ESMTP id 9650E180005 for ; Mon, 30 Dec 2024 17:56:45 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf16.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581432; 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=NgX1sHYsFGUW87qNeidZuY+X0xFEZh+rGS/R4qqusWc=; b=A1f+Kuopsw9uUxbUBX6y7ZomiK9IqQjAw/IpjMXlLUlwGOc9hGRuz/TvkzaA75qhVf/7ZQ 2awuR8J9EFTU90jT1AtNAjjUJWclVRvvKL+Sytv1xCcSfCWB0Zme7rz8nJD/fccDDdfYhU mRx044emDYXdMt8dv94bljZMU1qstM4= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf16.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581432; a=rsa-sha256; cv=none; b=zu7fblzo4o0TDjdqSFcGIGY8ez5WlHzgWc2MBQlKFzmsGziHFsOY/Wts3DYTPrypaSbWFg MDHEUrTXet+zYl9nl/3opGkZzPMbdajcmwnx8CFFykF3vm9j641PdjbwWAC7MGrtYp7oV8 MCUJs7lOAsjqPOpBgqNzlXeJ6TQrDaA= 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 1tSJze-000000008Lf-1jF1; Mon, 30 Dec 2024 12:55:54 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 08/12] x86/mm: use broadcast TLB flushing for page reclaim TLB flushing Date: Mon, 30 Dec 2024 12:53:09 -0500 Message-ID: <20241230175550.4046587-9-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 9650E180005 X-Stat-Signature: xtwbi99c8s18xxxtttcrkofxheykn3fm X-Rspam-User: X-Rspamd-Server: rspam11 X-HE-Tag: 1735581405-667409 X-HE-Meta: U2FsdGVkX19OheMkKB9GFlYlTLyI2suZE1Q70PyShddu0AU/IiX/ZxnOqaTjG4t8VlFoE798pLge/BlZDzdNKjgQOzZVMLYB3fHxgTUFd8r3Gsfh+p59bOiixTyXVRVGhr5eVyUvsVyVMKRz8CH5CPnxKfy1H9HZra27E2k6p1/Lnm4d7FGRXZO4htA1+Ynk4Wgc9F5Mmfqtp90KI8RWA/nBsr4P9fnPOoDzJQpG4Zd+KDlHMEt0TKhJJaqI3DD2bSXIXq349DBYFM4BSo4cS9p16Aqcjoe8WrYikIrBJhkJvHTWT+UuJ1LKUGu2hUCg5gzQBq0N/3zXz45jW+7iGw4tF3P1SUDosiWnWcwvIPAoYRoVzkTeA+3bHkmvKctjJTSSIFI7mWcjuAvl8vN0wKmLpoweTpBPfjbcUhRuXcn7lD/7GqOp6+QProYGkQ5Tpqr2Eo9qWuEhiW7Wsdg+A1snRDhQI0A2YN6cgHgsM8y4ugf1dG3DMMnTrL1PkiEq+At2m8vaxD2mFJlIavBTLPLiUty7jOJZkQWrJ7xp7sTk6xFtUsZ3rz9/cShltzk2n/HSbK83igr+mpcqIQiIFKvNqoMs5PHgcEpRaX2zB28PZp38KyPLssQ1TIG0lLS2iN0v6nQ3P5e/aPbQnlYlUzvNHSchDsKStEmIcXmsz1FY9CgNPq1M4Fz0SMsTUbkZQyT7bG8f5nVipJukqgp52zavhWZg3JhRT0ehnNsk4u1ryevAVzB7t/cLGWKxUe6WjYwOWwmxgtGYJce/1xCkAVVH65EyjzZLHHrNSTUQedQQUSdg6Ryz8uiPeYoaEs9RBt0zRu8iTDnz/q6HZ9CVOk7E9vGZtEjtqxSD3bn0yP609pz22NYDy5wT+JpIt6BSUBg/Ha/AZ/TIbbwYhq3Ag6PHkmOynzB73nuCnaOxWcZ7z5OsMM3/xD8rdjVNGo/hTJjBtFOiFYBCPTFqeNu BHOZdYmj fzwVTmmCUlUbbz6H5L4A5jZjWRy8P478Fsjl4IpXExO7x4l0/rBoIqJDFk5kvPHT/gZFpR8q0qR4Uygw2OHwE2VSsPUwhrnlmHktn3sZkxQNeF5THN2GS/kmZm3R+1Paa/FNsmdVxawSOrqGHLFN6bZ4sFkeRFHtMNa8yr0LyUp7IZh5BQVIlxx0c1EXxfg04SNYXQhHbqXgaWtC74lOdf1+eZQJPbJwu8VWb0jSJC4a7bI4wJPP1LYX9w4mIhxMm/6T2hy1969KngA6huFX2U/6dEc9S2KmasKZ9mCaVvB0Nh2Mtdch1dB7bcrPPvTAf7DFIGjmDon+UdwWfBYDBeWjGFzjRsmDg8PecOI3jAXxOwLu9aYiaYH5rpK0l4aPL7OZT 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: In the page reclaim code, we only track the CPU(s) where the TLB needs to be flushed, rather than all the individual mappings that may be getting invalidated. Use broadcast TLB flushing when that is available. Signed-off-by: Rik van Riel --- arch/x86/mm/tlb.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 266d5174fc7b..64f1679c37e1 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -1310,8 +1310,16 @@ EXPORT_SYMBOL_GPL(__flush_tlb_all); void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch) { struct flush_tlb_info *info; + int cpu; + + if (cpu_feature_enabled(X86_FEATURE_INVLPGB)) { + guard(preempt)(); + invlpgb_flush_all_nonglobals(); + tlbsync(); + return; + } - int cpu = get_cpu(); + cpu = get_cpu(); info = get_flush_tlb_info(NULL, 0, TLB_FLUSH_ALL, 0, false, TLB_GENERATION_INVALID); From patchwork Mon Dec 30 17:53:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923396 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 CD696E7718F for ; Mon, 30 Dec 2024 17:57:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 342E76B0085; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 2072A6B009E; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CFC1D8D0007; Mon, 30 Dec 2024 12:57:34 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 8FF598D0005 for ; Mon, 30 Dec 2024 12:57:34 -0500 (EST) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 46A54B0412 for ; Mon, 30 Dec 2024 17:57:34 +0000 (UTC) X-FDA: 82952381778.05.FB0A8A9 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf06.hostedemail.com (Postfix) with ESMTP id 9DE6B180010 for ; Mon, 30 Dec 2024 17:56:59 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf06.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581417; 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=Ajd4eD1JJbgZ9ftuwgvSCNAm6jjFAUX42HyPSeXgaBs=; b=d23QnQVqpyoxN6Mnpjt7lyT2lj+uS9AyfX60bvNjrH51eJddTPvKMK0BWYjMkgNNUFRMJM aIRebM7jXMrSz/sZPgVST1fNivHAIRkvrFupTwqEnK3ECmOkn+8gVfIOejkHicDXG5ewPU BMUZJQnOeqJnsb5sN5YIIkWhENF33gQ= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf06.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581417; a=rsa-sha256; cv=none; b=QJLKmS8GYFE86CueqZ73Y0ksEPPH7MQ+qG935GSpWMrwJ0a4h+hjCDGP7EPo+oq5v3wuCr TzVJxYblE9Ma/D2+scwzodRFjLGhwhfWG+UK69AU5fLsbmCWG6xR79JT38EI2K5O7UMmWk gUVkPzs7wFld0eXiW/S+oZUndjt1HpY= 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 1tSJze-000000008Lf-3Hji; Mon, 30 Dec 2024 12:55:54 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 09/12] x86/mm: enable broadcast TLB invalidation for multi-threaded processes Date: Mon, 30 Dec 2024 12:53:10 -0500 Message-ID: <20241230175550.4046587-10-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 9DE6B180010 X-Rspamd-Server: rspam12 X-Stat-Signature: kmydeakpo83k9wcezocfqkczbp4e7oef X-Rspam-User: X-HE-Tag: 1735581419-777220 X-HE-Meta: U2FsdGVkX1+NNVXR9DEyDrcxX0CNjPpM9HlSFAEviSYSAwDGL+xnBlwfbYF0Hfifer5uvZY252dvHbH147kN9+AY4nopZFQ7lOLi6OXLHqFrIDRb7HQNouR73Gok6YTr3LayVTLh2bgp041ih/bAOdIGHBlU2gntGtsb1ojcUgI7ygi9xvPed+9/IL6LttLInTuQ6qbABTclDWhUJ0l+/NFtti/szI4iFoCeWgIcP/SrPj1towhk2p8a+lRHFBKD/3EhflevYo9EwdUYQdupzwD0V3Hp+XHgVvQ7GQDa5iuEO2eZ0Zvt1DH1Qz4rQdsDrmGqYYdyQrnRv+1rRrFxQ0Q2xXqHUOkF/uBe89R8aZDd6lDC45c3xsdKHaXsEfyNGfSt0HB0Km5eg8rkQIAKeNcBMpVh6uwTNKTlbDkd/uDFmKzDtBYCEWwkOrP4icUWuhXoEsY2/yQQcDrAVAi0MpfFu56SQbJaDQjAlHLZuxxk/+hKgJdz4kMW+B8FvXt7SreS5ePVFw6BvyBcwYGW+hLAKiy/1sokjpESkmRS09bMF0Xzj1cC61fvWU7vzZ51EoI/8xztuV1wTS7yzStarl3U2/+NLtvmn0tciqGJ5ug79K8w+Ezh1U95VEO63INnyONMKIRi+8oQAHmouNq+HVoYPCKYxwn9Ryd7xl4+PfB73Om57IsHG3tQz/AYhZ7zgm7JhSahkOBjfXbJ6E03CactCTh6joQiCx7dCbq7SH23qSw1KKfVSneQR3CNg0H1ZB9ZLRI1a1zrEzUl3ZPEBnhEtzFSCBN9yHPiFOmBpenwuqBdj7id+QXwpYM5p7vHh5pLUi46/gyrvqG/oJ8iW79vS46kFRAP/5GZLwuqryj7gO9CSQhqjvx0D2OP/djR6LfXEaorgslWDmh0udE9/tgrD1mbuqu+vMwjTLP7SUG20bh61X/P8IFaJcROU+HP3NimTS9A1MFsdc+SwsS MaE/aGgJ GOSEFTtbc5YUQiSRfpFhUb6sCPeud+OociXuHaQtOkLv/M1mumtk3K0/ETJoBb2jCPhj/6j3Mg5QZQNhgWFhty4s4iMjFKWY3nR+pF7AkKeGsOtYG9cxK9QS0RQJGONZZDjeKWEMdooeQJz//yq4cHkzAyvhVcbds3lN6YQhvhuRtzqODJZmg10l3zQpOaGq5dnmdIqYnCBybwmyKwVXTua+k3demUXeS2UdpgJOmk4jwzASbtZAYoVbL3RDswHC9fgqJqQP5b132xG+S1J3tNdeijQrcMC0YMd/bgOvoKkrfV8pmleMmCWe2EZ2qZiibwDjTnzzzx0jFSV/uIC9Hvx19LzZxRmoWGHe9bfdyuP8Vgtlu7DYiBLOia0L68FuO86wBjqaxuVpe1VU= 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 broadcast TLB invalidation, using the INVPLGB instruction, on AMD EPYC 3 and newer CPUs. In order to not exhaust PCID space, and keep TLB flushes local for single threaded processes, we only hand out broadcast ASIDs to processes active on 3 or more CPUs, and gradually increase the threshold as broadcast ASID space is depleted. Signed-off-by: Rik van Riel --- arch/x86/include/asm/mmu.h | 6 + arch/x86/include/asm/mmu_context.h | 12 ++ arch/x86/include/asm/tlbflush.h | 17 ++ arch/x86/mm/tlb.c | 310 ++++++++++++++++++++++++++++- 4 files changed, 336 insertions(+), 9 deletions(-) diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h index 3b496cdcb74b..a8e8dfa5a520 100644 --- a/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h @@ -48,6 +48,12 @@ typedef struct { unsigned long flags; #endif +#ifdef CONFIG_CPU_SUP_AMD + struct list_head broadcast_asid_list; + u16 broadcast_asid; + bool asid_transition; +#endif + #ifdef CONFIG_ADDRESS_MASKING /* Active LAM mode: X86_CR3_LAM_U48 or X86_CR3_LAM_U57 or 0 (disabled) */ unsigned long lam_cr3_mask; diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 795fdd53bd0a..0dc446c427d2 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h @@ -139,6 +139,8 @@ static inline void mm_reset_untag_mask(struct mm_struct *mm) #define enter_lazy_tlb enter_lazy_tlb extern void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk); +extern void destroy_context_free_broadcast_asid(struct mm_struct *mm); + /* * Init a new mm. Used on mm copies, like at fork() * and on mm's that are brand-new, like at execve(). @@ -161,6 +163,13 @@ static inline int init_new_context(struct task_struct *tsk, mm->context.execute_only_pkey = -1; } #endif + +#ifdef CONFIG_CPU_SUP_AMD + INIT_LIST_HEAD(&mm->context.broadcast_asid_list); + mm->context.broadcast_asid = 0; + mm->context.asid_transition = false; +#endif + mm_reset_untag_mask(mm); init_new_context_ldt(mm); return 0; @@ -170,6 +179,9 @@ static inline int init_new_context(struct task_struct *tsk, static inline void destroy_context(struct mm_struct *mm) { destroy_context_ldt(mm); +#ifdef CONFIG_CPU_SUP_AMD + destroy_context_free_broadcast_asid(mm); +#endif } extern void switch_mm(struct mm_struct *prev, struct mm_struct *next, diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 20074f17fbcd..5e9956af98d1 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -65,6 +65,23 @@ static inline void cr4_clear_bits(unsigned long mask) */ #define TLB_NR_DYN_ASIDS 6 +#ifdef CONFIG_CPU_SUP_AMD +#define is_dyn_asid(asid) (asid) < TLB_NR_DYN_ASIDS +#define is_broadcast_asid(asid) (asid) >= TLB_NR_DYN_ASIDS +#define in_asid_transition(info) (info->mm && info->mm->context.asid_transition) +#define mm_broadcast_asid(mm) (mm->context.broadcast_asid) +#else +#define is_dyn_asid(asid) true +#define is_broadcast_asid(asid) false +#define in_asid_transition(info) false +#define mm_broadcast_asid(mm) 0 + +inline bool needs_broadcast_asid_reload(struct mm_struct *next, u16 prev_asid) +{ + return false; +} +#endif + struct tlb_context { u64 ctx_id; u64 tlb_gen; diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 64f1679c37e1..eb83391385ce 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -74,13 +74,15 @@ * use different names for each of them: * * ASID - [0, TLB_NR_DYN_ASIDS-1] - * the canonical identifier for an mm + * the canonical identifier for an mm, dynamically allocated on each CPU + * [TLB_NR_DYN_ASIDS, MAX_ASID_AVAILABLE-1] + * the canonical, global identifier for an mm, identical across all CPUs * - * kPCID - [1, TLB_NR_DYN_ASIDS] + * kPCID - [1, MAX_ASID_AVAILABLE] * the value we write into the PCID part of CR3; corresponds to the * ASID+1, because PCID 0 is special. * - * uPCID - [2048 + 1, 2048 + TLB_NR_DYN_ASIDS] + * uPCID - [2048 + 1, 2048 + MAX_ASID_AVAILABLE] * for KPTI each mm has two address spaces and thus needs two * PCID values, but we can still do with a single ASID denomination * for each mm. Corresponds to kPCID + 2048. @@ -225,6 +227,18 @@ static void choose_new_asid(struct mm_struct *next, u64 next_tlb_gen, return; } + /* + * TLB consistency for this ASID is maintained with INVLPGB; + * TLB flushes happen even while the process isn't running. + */ +#ifdef CONFIG_CPU_SUP_AMD + if (static_cpu_has(X86_FEATURE_INVLPGB) && mm_broadcast_asid(next)) { + *new_asid = mm_broadcast_asid(next); + *need_flush = false; + return; + } +#endif + if (this_cpu_read(cpu_tlbstate.invalidate_other)) clear_asid_other(); @@ -251,6 +265,245 @@ static void choose_new_asid(struct mm_struct *next, u64 next_tlb_gen, *need_flush = true; } +#ifdef CONFIG_CPU_SUP_AMD +/* + * Logic for AMD INVLPGB support. + */ +static DEFINE_RAW_SPINLOCK(broadcast_asid_lock); +static u16 last_broadcast_asid = TLB_NR_DYN_ASIDS; +static DECLARE_BITMAP(broadcast_asid_used, MAX_ASID_AVAILABLE) = { 0 }; +static LIST_HEAD(broadcast_asid_list); +static int broadcast_asid_available = MAX_ASID_AVAILABLE - TLB_NR_DYN_ASIDS - 1; + +static void reset_broadcast_asid_space(void) +{ + mm_context_t *context; + + lockdep_assert_held(&broadcast_asid_lock); + + /* + * Flush once when we wrap around the ASID space, so we won't need + * to flush every time we allocate an ASID for boradcast flushing. + */ + invlpgb_flush_all_nonglobals(); + tlbsync(); + + /* + * Leave the currently used broadcast ASIDs set in the bitmap, since + * those cannot be reused before the next wraparound and flush.. + */ + bitmap_clear(broadcast_asid_used, 0, MAX_ASID_AVAILABLE); + list_for_each_entry(context, &broadcast_asid_list, broadcast_asid_list) + __set_bit(context->broadcast_asid, broadcast_asid_used); + + last_broadcast_asid = TLB_NR_DYN_ASIDS; +} + +static u16 get_broadcast_asid(void) +{ + lockdep_assert_held(&broadcast_asid_lock); + + do { + u16 start = last_broadcast_asid; + u16 asid = find_next_zero_bit(broadcast_asid_used, MAX_ASID_AVAILABLE, start); + + if (asid >= MAX_ASID_AVAILABLE) { + reset_broadcast_asid_space(); + continue; + } + + /* Try claiming this broadcast ASID. */ + if (!test_and_set_bit(asid, broadcast_asid_used)) { + last_broadcast_asid = asid; + return asid; + } + } while (1); +} + +/* + * Returns true if the mm is transitioning from a CPU-local ASID to a broadcast + * (INVLPGB) ASID, or the other way around. + */ +static bool needs_broadcast_asid_reload(struct mm_struct *next, u16 prev_asid) +{ + u16 broadcast_asid = mm_broadcast_asid(next); + + if (broadcast_asid && prev_asid != broadcast_asid) + return true; + + if (!broadcast_asid && is_broadcast_asid(prev_asid)) + return true; + + return false; +} + +void destroy_context_free_broadcast_asid(struct mm_struct *mm) +{ + if (!mm->context.broadcast_asid) + return; + + guard(raw_spinlock_irqsave)(&broadcast_asid_lock); + mm->context.broadcast_asid = 0; + list_del(&mm->context.broadcast_asid_list); + broadcast_asid_available++; +} + +static bool mm_active_cpus_exceeds(struct mm_struct *mm, int threshold) +{ + int count = 0; + int cpu; + + if (cpumask_weight(mm_cpumask(mm)) <= threshold) + return false; + + for_each_cpu(cpu, mm_cpumask(mm)) { + /* Skip the CPUs that aren't really running this process. */ + if (per_cpu(cpu_tlbstate.loaded_mm, cpu) != mm) + continue; + + if (per_cpu(cpu_tlbstate_shared.is_lazy, cpu)) + continue; + + if (++count > threshold) + return true; + } + return false; +} + +/* + * Assign a broadcast ASID to the current process, protecting against + * races between multiple threads in the process. + */ +static void use_broadcast_asid(struct mm_struct *mm) +{ + guard(raw_spinlock_irqsave)(&broadcast_asid_lock); + + /* This process is already using broadcast TLB invalidation. */ + if (mm->context.broadcast_asid) + return; + + mm->context.broadcast_asid = get_broadcast_asid(); + mm->context.asid_transition = true; + list_add(&mm->context.broadcast_asid_list, &broadcast_asid_list); + broadcast_asid_available--; +} + +/* + * Figure out whether to assign a broadcast (global) ASID to a process. + * We vary the threshold by how empty or full broadcast ASID space is. + * 1/4 full: >= 4 active threads + * 1/2 full: >= 8 active threads + * 3/4 full: >= 16 active threads + * 7/8 full: >= 32 active threads + * etc + * + * This way we should never exhaust the broadcast ASID space, even on very + * large systems, and the processes with the largest number of active + * threads should be able to use broadcast TLB invalidation. + */ +#define HALFFULL_THRESHOLD 8 +static bool meets_broadcast_asid_threshold(struct mm_struct *mm) +{ + int avail = broadcast_asid_available; + int threshold = HALFFULL_THRESHOLD; + + if (!avail) + return false; + + if (avail > MAX_ASID_AVAILABLE * 3 / 4) { + threshold = HALFFULL_THRESHOLD / 4; + } else if (avail > MAX_ASID_AVAILABLE / 2) { + threshold = HALFFULL_THRESHOLD / 2; + } else if (avail < MAX_ASID_AVAILABLE / 3) { + do { + avail *= 2; + threshold *= 2; + } while ((avail + threshold) < MAX_ASID_AVAILABLE / 2); + } + + return mm_active_cpus_exceeds(mm, threshold); +} + +static void count_tlb_flush(struct mm_struct *mm) +{ + if (!static_cpu_has(X86_FEATURE_INVLPGB)) + return; + + /* Check every once in a while. */ + if ((current->pid & 0x1f) != (jiffies & 0x1f)) + return; + + if (meets_broadcast_asid_threshold(mm)) + use_broadcast_asid(mm); +} + +static void finish_asid_transition(struct flush_tlb_info *info) +{ + struct mm_struct *mm = info->mm; + int bc_asid = mm_broadcast_asid(mm); + int cpu; + + if (!mm->context.asid_transition) + return; + + for_each_cpu(cpu, mm_cpumask(mm)) { + if (READ_ONCE(per_cpu(cpu_tlbstate.loaded_mm, cpu)) != mm) + continue; + + /* + * If at least one CPU is not using the broadcast ASID yet, + * send a TLB flush IPI. The IPI should cause stragglers + * to transition soon. + */ + if (per_cpu(cpu_tlbstate.loaded_mm_asid, cpu) != bc_asid) { + flush_tlb_multi(mm_cpumask(info->mm), info); + return; + } + } + + /* All the CPUs running this process are using the broadcast ASID. */ + mm->context.asid_transition = 0; +} + +static void broadcast_tlb_flush(struct flush_tlb_info *info) +{ + bool pmd = info->stride_shift == PMD_SHIFT; + unsigned long maxnr = invlpgb_count_max; + unsigned long asid = info->mm->context.broadcast_asid; + unsigned long addr = info->start; + unsigned long nr; + + /* Flushing multiple pages at once is not supported with 1GB pages. */ + if (info->stride_shift > PMD_SHIFT) + maxnr = 1; + + if (info->end == TLB_FLUSH_ALL) { + invlpgb_flush_single_pcid(kern_pcid(asid)); + /* Do any CPUs supporting INVLPGB need PTI? */ + if (static_cpu_has(X86_FEATURE_PTI)) + invlpgb_flush_single_pcid(user_pcid(asid)); + } else do { + /* + * Calculate how many pages can be flushed at once; if the + * remainder of the range is less than one page, flush one. + */ + nr = min(maxnr, (info->end - addr) >> info->stride_shift); + nr = max(nr, 1); + + invlpgb_flush_user_nr(kern_pcid(asid), addr, nr, pmd); + /* Do any CPUs supporting INVLPGB need PTI? */ + if (static_cpu_has(X86_FEATURE_PTI)) + invlpgb_flush_user_nr(user_pcid(asid), addr, nr, pmd); + addr += nr << info->stride_shift; + } while (addr < info->end); + + finish_asid_transition(info); + + /* Wait for the INVLPGBs kicked off above to finish. */ + tlbsync(); +} +#endif /* CONFIG_CPU_SUP_AMD */ + /* * Given an ASID, flush the corresponding user ASID. We can delay this * until the next time we switch to it. @@ -556,8 +809,9 @@ void switch_mm_irqs_off(struct mm_struct *unused, struct mm_struct *next, */ if (prev == next) { /* Not actually switching mm's */ - VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) != - next->context.ctx_id); + if (is_dyn_asid(prev_asid)) + VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) != + next->context.ctx_id); /* * If this races with another thread that enables lam, 'new_lam' @@ -573,6 +827,23 @@ void switch_mm_irqs_off(struct mm_struct *unused, struct mm_struct *next, !cpumask_test_cpu(cpu, mm_cpumask(next)))) cpumask_set_cpu(cpu, mm_cpumask(next)); + /* + * Check if the current mm is transitioning to a new ASID. + */ + if (needs_broadcast_asid_reload(next, prev_asid)) { + next_tlb_gen = atomic64_read(&next->context.tlb_gen); + + choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush); + goto reload_tlb; + } + + /* + * Broadcast TLB invalidation keeps this PCID up to date + * all the time. + */ + if (is_broadcast_asid(prev_asid)) + return; + /* * If the CPU is not in lazy TLB mode, we are just switching * from one thread in a process to another thread in the same @@ -626,8 +897,10 @@ void switch_mm_irqs_off(struct mm_struct *unused, struct mm_struct *next, barrier(); } +reload_tlb: new_lam = mm_lam_cr3_mask(next); if (need_flush) { + VM_BUG_ON(is_broadcast_asid(new_asid)); this_cpu_write(cpu_tlbstate.ctxs[new_asid].ctx_id, next->context.ctx_id); this_cpu_write(cpu_tlbstate.ctxs[new_asid].tlb_gen, next_tlb_gen); load_new_mm_cr3(next->pgd, new_asid, new_lam, true); @@ -746,7 +1019,7 @@ static void flush_tlb_func(void *info) const struct flush_tlb_info *f = info; struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm); u32 loaded_mm_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid); - u64 local_tlb_gen = this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen); + u64 local_tlb_gen; bool local = smp_processor_id() == f->initiating_cpu; unsigned long nr_invalidate = 0; u64 mm_tlb_gen; @@ -769,6 +1042,16 @@ static void flush_tlb_func(void *info) if (unlikely(loaded_mm == &init_mm)) return; + /* Reload the ASID if transitioning into or out of a broadcast ASID */ + if (needs_broadcast_asid_reload(loaded_mm, loaded_mm_asid)) { + switch_mm_irqs_off(NULL, loaded_mm, NULL); + loaded_mm_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid); + } + + /* Broadcast ASIDs are always kept up to date with INVLPGB. */ + if (is_broadcast_asid(loaded_mm_asid)) + return; + VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].ctx_id) != loaded_mm->context.ctx_id); @@ -786,6 +1069,8 @@ static void flush_tlb_func(void *info) return; } + local_tlb_gen = this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen); + if (unlikely(f->new_tlb_gen != TLB_GENERATION_INVALID && f->new_tlb_gen <= local_tlb_gen)) { /* @@ -953,7 +1238,7 @@ STATIC_NOPV void native_flush_tlb_multi(const struct cpumask *cpumask, * up on the new contents of what used to be page tables, while * doing a speculative memory access. */ - if (info->freed_tables) + if (info->freed_tables || in_asid_transition(info)) on_each_cpu_mask(cpumask, flush_tlb_func, (void *)info, true); else on_each_cpu_cond_mask(should_flush_tlb, flush_tlb_func, @@ -1026,14 +1311,18 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, bool freed_tables) { struct flush_tlb_info *info; + unsigned long threshold = tlb_single_page_flush_ceiling; u64 new_tlb_gen; int cpu; + if (static_cpu_has(X86_FEATURE_INVLPGB)) + threshold *= invlpgb_count_max; + cpu = get_cpu(); /* Should we flush just the requested range? */ if ((end == TLB_FLUSH_ALL) || - ((end - start) >> stride_shift) > tlb_single_page_flush_ceiling) { + ((end - start) >> stride_shift) > threshold) { start = 0; end = TLB_FLUSH_ALL; } @@ -1049,9 +1338,12 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, * a local TLB flush is needed. Optimize this use-case by calling * flush_tlb_func_local() directly in this case. */ - if (cpumask_any_but(mm_cpumask(mm), cpu) < nr_cpu_ids) { + if (IS_ENABLED(CONFIG_CPU_SUP_AMD) && mm_broadcast_asid(mm)) { + broadcast_tlb_flush(info); + } else if (cpumask_any_but(mm_cpumask(mm), cpu) < nr_cpu_ids) { info->trim_cpumask = should_trim_cpumask(mm); flush_tlb_multi(mm_cpumask(mm), info); + count_tlb_flush(mm); } else if (mm == this_cpu_read(cpu_tlbstate.loaded_mm)) { lockdep_assert_irqs_enabled(); local_irq_disable(); From patchwork Mon Dec 30 17:53:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923394 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 BBAFEE77188 for ; Mon, 30 Dec 2024 17:57:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 898CF8D0003; Mon, 30 Dec 2024 12:57:34 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 818CC8D0006; Mon, 30 Dec 2024 12:57:34 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 50CAB8D0003; Mon, 30 Dec 2024 12:57:34 -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 081A78D0005 for ; Mon, 30 Dec 2024 12:57:34 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A77E2449CA for ; Mon, 30 Dec 2024 17:57:33 +0000 (UTC) X-FDA: 82952382282.28.0D2DE70 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf03.hostedemail.com (Postfix) with ESMTP id C812A20006 for ; Mon, 30 Dec 2024 17:57:10 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf03.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581430; 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=Do+LP4XQNWNMPC/i/rud3jVU52LLXdIBm5f/1WHcQCo=; b=RtJ1n4P5//jL7UhWOcp2mMDgWC1COilHjkOWGBcOjehPQJ4pT2Ieyh+tAOak8cvhpTwJRZ av5pRKB7RnKaIfwnnLROswdczyd808WZqrieaNA2jSpDNEyPYuhOo4uhPcmPIzyE9nT/dr JZZs3sUkjgn+ePBP5ndII7fcl5h9poQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581430; a=rsa-sha256; cv=none; b=SZDTgg2CFb24JtS00H3P+cuoU3RUHboLX4aBOsqehaLE6Yzxy6XlMYGgwBBwZ/6izv2W7E +5M85+hJqQzpWOWzIw9jhR0FwSLS5FapBFk6uZfBOHknloD6R8xCklnwwW3fujpOFtwBI8 1gYY3DW6rHLFz9Q0Ve547DPG3oanyxg= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf03.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com 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 1tSJzf-000000008Lf-0ChP; Mon, 30 Dec 2024 12:55:55 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 10/12] x86,tlb: do targeted broadcast flushing from tlbbatch code Date: Mon, 30 Dec 2024 12:53:11 -0500 Message-ID: <20241230175550.4046587-11-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Stat-Signature: opig48bi1wp8keupykaj53c4jieodean X-Rspamd-Queue-Id: C812A20006 X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1735581430-256942 X-HE-Meta: U2FsdGVkX1+J5e8rQi6Pg+mY7alg722Au8oKwk5hIj9AQ0/GZariqmxEU0s+0dWC+kovJEwKfvYBqiS4qJAWL6+6g9ZfBH3YhQJcJ3cfEz8OEV4OgChKDZXicf1o87pUnl38ZuK/USbAEUyvZ/DM8s6scJwPSSAcUzxEKzlctLhjapXzX+wEFqGAbWb+ZiH1rMPrpKDIdyDlwJjNtVBKg76ogzLhcI3x28zd0JQkvupbdcZ2zy7gqNbdXtZuSO/fMzzAOF11hSyU9Kga819EGLIpQLiUMXAAJKjJcr6QvkKzNYixr+guOY/S7XhMnPRJPoNjYpCqna09vuUmSgaYmJdmMVeF+bKYiNP1QqoZaq3xjRd7+ll0xwIi/HYC8AQ/9KcvnBBXu7Pzo6QOY/o3k/077X4J3W5BriLdbppSWZNs+fGuPqKc9eE7REIadWoSqrrvPrW+0nvHQ1ITnLQOqhvVQpy9PPUAlH9xAFY5f2eDJvz4mHxnXnU5COq25C+TPkh28qJwZHuXqaXseItRLfeJ7NGPQDPBRgkDX7pIQkAjrMobFeCiKJ861f2w5aVRb2Ri2BYdLszrGzJia08A/W9HRq+H+ikIPUibbireuiVxaXQMkqngIofl0DfTjHOhypwv2WxgyOmhPpV89rI9RoWPeup7j3uoxfPr6PqsNRN3Q+cgLArwlG+8Wc5SSY955u8Os7HrpVXOB/io7T048Tbecyc4acf34CWlwhKNJZR5zN3D8YbtNDfZehIlAH9x1/ZIlT62tK15aWeW3gw118ZFmA8dIKRbTr21Ron50Oh5fiwu/bg7NpHgmwIqSV+FuRIoWNcqdTQ8whEA3yLMvZXxrMylzT0q3MnxYzKWYDbbKSAdUQbhXoKPuDrLiudOEr3yd7duut29YaUe3euNyIAtXws4q4EvdR8k6oziQa2YdE6cM+es8+JpNAMHeCvaap51VPrI1VHo/ctlQIP K7RiGWsM OIhpoUVQEEU/f9VDAibU0YP3+nOXPueVdmg4R5WJBNX/YzPLh8Xxgu6tmWU5jISBJJAEkvG3Bv3aFNR7zYZLtCNuPYPgExsmskdGZdHnGmobzfR6IVHrUOcTRdQKA4D8DCNKjYIH9LJgSvsTP97Ec5AWHD+rhI7JiOzLgUgJNIFfeD05HB0ftPp0oQ+KLFZ6lk+QQbDbs+aKbAUWOKHBP61dELwGG42FrkIG0lXv9HA17f+wbxXCqH6w7r3OQ8/BD8NU5FSKP/zuFX0AR5P7d/3XbdmopdbH8kVdXbyWQvepvJ2muQuMr9ER5bCN88uWtDsDZ/SKaaIqHN0TTLtPUB2AGIRgingGb1toKs7gkj6Cyk7IgNLBC5OAOjBEfRx0peief 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: Instead of doing a system-wide TLB flush from arch_tlbbatch_flush, queue up asynchronous, targeted flushes from arch_tlbbatch_add_pending. This also allows us to avoid adding the CPUs of processes using broadcast flushing to the batch->cpumask, and will hopefully further reduce TLB flushing from the reclaim and compaction paths. Signed-off-by: Rik van Riel --- arch/x86/include/asm/tlbbatch.h | 1 + arch/x86/include/asm/tlbflush.h | 12 +++------ arch/x86/mm/tlb.c | 48 ++++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/asm/tlbbatch.h b/arch/x86/include/asm/tlbbatch.h index 1ad56eb3e8a8..f9a17edf63ad 100644 --- a/arch/x86/include/asm/tlbbatch.h +++ b/arch/x86/include/asm/tlbbatch.h @@ -10,6 +10,7 @@ struct arch_tlbflush_unmap_batch { * the PFNs being flushed.. */ struct cpumask cpumask; + bool used_invlpgb; }; #endif /* _ARCH_X86_TLBBATCH_H */ diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 5e9956af98d1..17ec1b169ebd 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -297,21 +297,15 @@ static inline u64 inc_mm_tlb_gen(struct mm_struct *mm) return atomic64_inc_return(&mm->context.tlb_gen); } -static inline void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *batch, - struct mm_struct *mm, - unsigned long uaddr) -{ - inc_mm_tlb_gen(mm); - cpumask_or(&batch->cpumask, &batch->cpumask, mm_cpumask(mm)); - mmu_notifier_arch_invalidate_secondary_tlbs(mm, 0, -1UL); -} - static inline void arch_flush_tlb_batched_pending(struct mm_struct *mm) { flush_tlb_mm(mm); } extern void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch); +extern void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *batch, + struct mm_struct *mm, + unsigned long uaddr); static inline bool pte_flags_need_flush(unsigned long oldflags, unsigned long newflags, diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index eb83391385ce..454a370494d3 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -1602,16 +1602,7 @@ EXPORT_SYMBOL_GPL(__flush_tlb_all); void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch) { struct flush_tlb_info *info; - int cpu; - - if (cpu_feature_enabled(X86_FEATURE_INVLPGB)) { - guard(preempt)(); - invlpgb_flush_all_nonglobals(); - tlbsync(); - return; - } - - cpu = get_cpu(); + int cpu = get_cpu(); info = get_flush_tlb_info(NULL, 0, TLB_FLUSH_ALL, 0, false, TLB_GENERATION_INVALID); @@ -1629,12 +1620,49 @@ void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch) local_irq_enable(); } + /* + * If we issued (asynchronous) INVLPGB flushes, wait for them here. + * The cpumask above contains only CPUs that were running tasks + * not using broadcast TLB flushing. + */ + if (cpu_feature_enabled(X86_FEATURE_INVLPGB) && batch->used_invlpgb) { + tlbsync(); + migrate_enable(); + batch->used_invlpgb = false; + } + cpumask_clear(&batch->cpumask); put_flush_tlb_info(); put_cpu(); } +void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *batch, + struct mm_struct *mm, + unsigned long uaddr) +{ + if (static_cpu_has(X86_FEATURE_INVLPGB) && mm_broadcast_asid(mm)) { + u16 asid = mm_broadcast_asid(mm); + /* + * Queue up an asynchronous invalidation. The corresponding + * TLBSYNC is done in arch_tlbbatch_flush(), and must be done + * on the same CPU. + */ + if (!batch->used_invlpgb) { + batch->used_invlpgb = true; + migrate_disable(); + } + invlpgb_flush_user_nr(kern_pcid(asid), uaddr, 1, 0); + /* Do any CPUs supporting INVLPGB need PTI? */ + if (static_cpu_has(X86_FEATURE_PTI)) + invlpgb_flush_user_nr(user_pcid(asid), uaddr, 1, 0); + } else { + inc_mm_tlb_gen(mm); + cpumask_or(&batch->cpumask, &batch->cpumask, mm_cpumask(mm)); + } + mmu_notifier_arch_invalidate_secondary_tlbs(mm, 0, -1UL); +} + /* * Blindly accessing user memory from NMI context can be dangerous * if we're in the middle of switching the current user task or From patchwork Mon Dec 30 17:53:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923393 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 80961E77194 for ; Mon, 30 Dec 2024 17:57:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5D09C8D0001; Mon, 30 Dec 2024 12:57:34 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 580478D0005; Mon, 30 Dec 2024 12:57:34 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 42C4A8D0001; Mon, 30 Dec 2024 12:57:34 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 061F88D0003 for ; Mon, 30 Dec 2024 12:57:33 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id AD7511C93F1 for ; Mon, 30 Dec 2024 17:57:33 +0000 (UTC) X-FDA: 82952381400.26.ADCFDFA Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf22.hostedemail.com (Postfix) with ESMTP id 7E549C0005 for ; Mon, 30 Dec 2024 17:56:43 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=none; spf=pass (imf22.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=1735581420; 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=/ROEAJWpnVZFJf4Dg9ia9HcbvCnSCRF4EwlBtxxwlFY=; b=lft0DP+HQRXie7HaGrsCaDT5Yf1uheD1Kdoza632qO2entrCkz6/4pmZrZZthNjjXkmWrd d9Ii81K5C1CA7QJ9qaqGbrDiOqwEcBdMg+ixhziboZpymZWDu74N/5Lex/Pv11sEZrR1L9 h+Ed4POSrc1nsazdUkgwpTlTnMCaNDU= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581420; a=rsa-sha256; cv=none; b=0Fu7YeRQivBYWEDFTWCHeK8DK82Im0wpmWKS2UciO5AwM8l57NrCdFHKhav1vV0sYZ9P20 Ogv4yt3b6R+4nPb3NkgRkOlBKY5HmSTFL06RHThJmcVlUbKvaklk8/KWnyy5R7slnAr4u3 4kVRuMTH18yzvHduYdUbF0MEbs4OqgA= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=none; spf=pass (imf22.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com; dmarc=none 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 1tSJzf-000000008Lf-1Qtd; Mon, 30 Dec 2024 12:55:55 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 11/12] x86/mm: enable AMD translation cache extensions Date: Mon, 30 Dec 2024 12:53:12 -0500 Message-ID: <20241230175550.4046587-12-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 7E549C0005 X-Stat-Signature: 344mpmu9r5gmsfkdkbhx99whea7hx3z7 X-Rspam-User: X-HE-Tag: 1735581403-157587 X-HE-Meta: U2FsdGVkX1/eFevoKg8PwhmFpLWm2TmxRjzPlJSLpB6MBhf9ij/fqMLkjrtHFOPv3ja/ND9lSgdTErZ9DukYzPduRPgScggjYRNhaRkT9Yg6eD04GdN+1mMKtuIdcdlGea5eaTpYozwnR3qomOVfZGyAb56Ti84tXo/q6mgXlVqBNIrS65xlNq8z9www9KyZNe7Wot273XlKmTvzr9FaaeWcBgnjl2mRlI9O2ximX7Qm9wbnOTbpPN+s4I493suxT5xWvnh77SX6AQjVgCX0DyG2AXw0ztOo6TfH2Av3t0z5/nQJ+nv/oxMt/5tBmGdzgUrQv2WT7gDSmAa+IOsGGRZGYoDOzcqQjQGCqcYzMEZfL8OVaKGh/N16MtW6xJfLWCkP+egMMy6hPiOq2/CtaANRxR/b1sIPXfj/B3bugU4Cl7xxBXVZ5VnL92qcBm5BNEi/3mcq/WDi8jsLdmiIH15HXwEisyJrvmePJyvjkUZNJND/gpYIMGi7LOsqUkB8SGzrIqdHitMAFUsep/oUcA/za4LWnBq1luJ9SbMGkg8l4It1R7D8MR0DMkjtK3Hl1cjjp3arY9m8JZJvs+XaOyu3O+vrIZTtcVZawPjye73cfG2VDW4knnwAm2Bcil1f6V8F9LJPxQ9d/4h2lslbDx/Ojl/a8jXGcNlV2dJgJdQAVedH7T2HhCXCNqm2jRfL/8++rglkVUqo5lFRK8viXRfO8sCJFJyVm6W/FqKzoAETZ2mRoSRMuaOswnmVl2dlO0YwT+gOYKcIvVn4WbJi8JfbXpYAvFgW3Cw8RuhTGFgz6jKqVLXpJ1DW3NZW95xMS3LLjvxAa+OSaoGJlB6S8oEzjpNfqiyqcbF9zXxqnMaQgA1dbB4SA2OzWfKMC4RFBjEdXCrIV/7Oq5VshK9oYm7WoFsEc8C3Y+KcrmcgpjI+G5/PO779uaGSnDlepVXhW36d1kkEA/tAf46Cp4V Ftaiz1oU TIUIYurlDRRE5KeM4N4mlAa59erSaM8pDeN9AD9wz2e6tceJJxEQB8oeA4P24ZhONnHYwNQw1sPa3bO/LAB8cxUdztxdgKPLpoIh8RUXEZT5W6agWNFtArdxmbaiPGs/88RB5Xf9vWIz/gjZWacwH5hEp9KVmD6+QSrA9LWBjm2UUXOzjxztIIxCI53pLRqxNadu6m24l15f1hafrYsTsCIyQTCq6GlZdYoLhmokOj8PUbf2cP+811fHwqrusq/7FnROxGslmq/m13Bcdxgod85oTywlnfRsH12VB/2BYlwfhck2DbRaEGluTaPpRuh2+wyNlW3AvOZxFRPGr62V/nDy4e8lJRih/fp6TI0J1kl35BSEY2pPnLgoyxm1zE5G86F/f 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: With AMD TCE (translation cache extensions) only the intermediate mappings that cover the address range zapped by INVLPG / INVLPGB get invalidated, rather than all intermediate mappings getting zapped at every TLB invalidation. This can help reduce the TLB miss rate, by keeping more intermediate mappings in the cache. From the AMD manual: Translation Cache Extension (TCE) Bit. Bit 15, read/write. Setting this bit to 1 changes how the INVLPG, INVLPGB, and INVPCID instructions operate on TLB entries. When this bit is 0, these instructions remove the target PTE from the TLB as well as all upper-level table entries that are cached in the TLB, whether or not they are associated with the target PTE. When this bit is set, these instructions will remove the target PTE and only those upper-level entries that lead to the target PTE in the page table hierarchy, leaving unrelated upper-level entries intact. Signed-off-by: Rik van Riel --- arch/x86/kernel/cpu/amd.c | 8 ++++++++ arch/x86/mm/tlb.c | 10 +++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 226b8fc64bfc..4dc42705aaca 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -1143,6 +1143,14 @@ static void cpu_detect_tlb_amd(struct cpuinfo_x86 *c) /* Max number of pages INVLPGB can invalidate in one shot */ invlpgb_count_max = (edx & 0xffff) + 1; + + /* If supported, enable translation cache extensions (TCE) */ + cpuid(0x80000001, &eax, &ebx, &ecx, &edx); + if (ecx & BIT(17)) { + u64 msr = native_read_msr(MSR_EFER);; + msr |= BIT(15); + wrmsrl(MSR_EFER, msr); + } } static const struct cpu_dev amd_cpu_dev = { diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 454a370494d3..585d0731ca9f 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -477,7 +477,7 @@ static void broadcast_tlb_flush(struct flush_tlb_info *info) if (info->stride_shift > PMD_SHIFT) maxnr = 1; - if (info->end == TLB_FLUSH_ALL) { + if (info->end == TLB_FLUSH_ALL || info->freed_tables) { invlpgb_flush_single_pcid(kern_pcid(asid)); /* Do any CPUs supporting INVLPGB need PTI? */ if (static_cpu_has(X86_FEATURE_PTI)) @@ -1110,7 +1110,7 @@ static void flush_tlb_func(void *info) * * The only question is whether to do a full or partial flush. * - * We do a partial flush if requested and two extra conditions + * We do a partial flush if requested and three extra conditions * are met: * * 1. f->new_tlb_gen == local_tlb_gen + 1. We have an invariant that @@ -1137,10 +1137,14 @@ static void flush_tlb_func(void *info) * date. By doing a full flush instead, we can increase * local_tlb_gen all the way to mm_tlb_gen and we can probably * avoid another flush in the very near future. + * + * 3. No page tables were freed. If page tables were freed, a full + * flush ensures intermediate translations in the TLB get flushed. */ if (f->end != TLB_FLUSH_ALL && f->new_tlb_gen == local_tlb_gen + 1 && - f->new_tlb_gen == mm_tlb_gen) { + f->new_tlb_gen == mm_tlb_gen && + !f->freed_tables) { /* Partial flush */ unsigned long addr = f->start; From patchwork Mon Dec 30 17:53:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rik van Riel X-Patchwork-Id: 13923403 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 40839E77188 for ; Mon, 30 Dec 2024 17:58:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AF82B6B009E; Mon, 30 Dec 2024 12:57:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7F4046B00AD; Mon, 30 Dec 2024 12:57:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2A3E36B00AA; Mon, 30 Dec 2024 12:57:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 603E76B009E for ; Mon, 30 Dec 2024 12:57:35 -0500 (EST) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 15F981407D4 for ; Mon, 30 Dec 2024 17:57:35 +0000 (UTC) X-FDA: 82952381400.10.38E5A6C Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) by imf29.hostedemail.com (Postfix) with ESMTP id 213B512001F for ; Mon, 30 Dec 2024 17:56:26 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf29.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1735581417; 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=SXXuSMpFNCfzTFZ81LFvoO369pHVUEu6XId56aIoa+E=; b=aCr9cE2v59CwOZLn+aDsj9PNIg89NVvo+B8s0wEo1xvvnj4xyCW/mC0mBHoElbtHXnqXcN X61/mNq5tCQN2/uqMEzYIqlQKmJLLquiFlNw74DMk90WCp79hZ8krAEm0zhYoFjT5RXg6+ 1jKCUk9CM83V+r2iZMDbqYClwFXwJQs= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf29.hostedemail.com: domain of riel@shelob.surriel.com designates 96.67.55.147 as permitted sender) smtp.mailfrom=riel@shelob.surriel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1735581417; a=rsa-sha256; cv=none; b=M5zec0ZTmfm513MT1JWF4EehhaTti/OHkU1GAZoa4otjNUrGnlU0IhHdYgeXCGA+NQXpCa UlRYuyRi7r3WS/4BzBP2j1krL+Nyl6B6pwfUU37lISAU1F/JwNlTldm5FNk5wdz47rBW03 NMQOHziGTuaUhOqPxCfBlFpAiUvO91Y= 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 1tSJzf-000000008Lf-2gRa; Mon, 30 Dec 2024 12:55:55 -0500 From: Rik van Riel To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, akpm@linux-foundation.org, nadav.amit@gmail.com, zhengqi.arch@bytedance.com, linux-mm@kvack.org, Rik van Riel Subject: [PATCH 12/12] x86/mm: only invalidate final translations with INVLPGB Date: Mon, 30 Dec 2024 12:53:13 -0500 Message-ID: <20241230175550.4046587-13-riel@surriel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241230175550.4046587-1-riel@surriel.com> References: <20241230175550.4046587-1-riel@surriel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 213B512001F X-Rspamd-Server: rspam12 X-Stat-Signature: 3e5w99gj7m9awrtdynhiwcttxxpf843h X-Rspam-User: X-HE-Tag: 1735581386-355154 X-HE-Meta: U2FsdGVkX19EWO4uFZ3KJU/mv7mIZ27YXbBBEy6cE1gbYCnJzobsNXw0/bdADgkDtsWNloJKz9+be2RGcfIpFXms6gMm/LfxCla4AjP3sC7X6jE93oiOvZqTkNFxLn/wTatACXO9RD8wNHEPPyLv+jZ9APNNgUWF7jTtFyXwERbX52xpcU+JZcw0BVTDIqbuYGcplt+kvFSOjeUk6d2r62hii19kxXraWVSxv9i22SNpt4Dm7V73w1gVEaGJA6Q53LJXcatSbG9gd+SXgpkbT7Qi5h02duEBDr3jSmeknO7qrbJoEGMIq8XHydMt03KlWF4CKerCT/MkTF9xHXTVcLXQOXu6KFlQoNpohkSU9GasZwW4S9Tc+gvMVjK9c90VVZk2G27EXKn65e3Ro4YZpMEa+wVhRYOyZsu8v9HWaNpdAPS6Is2lBys/VLFVn4D+Ku7NaaHIXRbLAVA5AwaIyKDfPSseDTfvzF8e28TsoTh2OhFnnenhkn9GE+DiQl0iJ/mjkzJwkEH3g+S8Jgj85K3r8dl3R1wOpsJQ/J8Ek6379J6yQF8Jn87sOI06eLeixuUf2xUFLATY3Xk7fbpRRD4B//KJdevU3nG5ChQUqYnMEgZkg0fo+tkCSxtMGdy8jLxzWPdXQEmm8ZJkl2NM+rm/4p2nSmwsWWjT3VWBUilaV/t78P2wmrxOSJ2ltHi4PYOwDcDJtUeuNgxm2jSwvwBEFkwu8tsFTsZv8Bk+Zet5q8gB3MC2i/SbyKxRz6aolPiidYzU8JwBms76XmYPq3LoOhdoH5S5aHi5QMmxbHWsURPwpnfyUCdz5iOF+QqbTussz02ZeV00Mihtw5hXpdeKoAD0UY6UJ+PxqIVw5bFs9KMUQx/31NE0roiTMRCZY+sxc+467EV/GGN6V7OUf6udasW5Kg27gTluC6TlJxN5GaSadflNLIrrE0m04rNVT/aK189gNl959cAtAwW 4qygw2Vk UpdLl80v2wGDKdtyc33yQClgVhVDhZpk0uWjl3FTE5PifO9TZOsZX8EwXz5yDAPSYQr1Mkc7VTeuf6YF04F21twasLPBketBkcrXyCEdtiy7Nixdyyno63FaGZM1KH9/oSi8UFkYjd4QAzzncq6YQhMcKQZ332RkCNSfzy9agl+f7ZQt1Z5ZVhYGmLaMa2MjdMmcFBimtFi8EDH+B+I/CNtA6vX4NBrA/F0dmmBg5Gx4zoulyVVmi3RjcE41jczZ9XRzCVpn+ASOaO6V+DYeyKv3s2TtY24j3Q1cb9COGa0WBzCSmvRPPOe+rf52FHSVJofkqhYy+DtUQ1HvSlrXp3qTLRxeE4Wh40ukx6aD4yBvbZ4QWCDTHupaElSl296l37gzK8mMg9Wk5ShY= 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 --- arch/x86/include/asm/invlpgb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/include/asm/invlpgb.h b/arch/x86/include/asm/invlpgb.h index 862775897a54..2669ebfffe81 100644 --- a/arch/x86/include/asm/invlpgb.h +++ b/arch/x86/include/asm/invlpgb.h @@ -51,7 +51,7 @@ static inline void invlpgb_flush_user(unsigned long pcid, static inline void invlpgb_flush_user_nr(unsigned long pcid, unsigned long addr, int nr, bool pmd_stride) { - __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID | INVLPGB_VA); + __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID | INVLPGB_VA | INVLPGB_FINAL_ONLY); } /* Flush all mappings for a given ASID, not including globals. */