From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 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 Content-Transfer-Encoding: 8bit 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) { -- 2.47.1