From patchwork Tue Mar 4 15:04:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ryan Roberts X-Patchwork-Id: 14000874 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 C8F88C021B8 for ; Tue, 4 Mar 2025 15:05:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8250E6B009B; Tue, 4 Mar 2025 10:05:19 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7AE606B009C; Tue, 4 Mar 2025 10:05:19 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 58A946B009D; Tue, 4 Mar 2025 10:05:19 -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 2829F6B009B for ; Tue, 4 Mar 2025 10:05:19 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id CED7E1A0221 for ; Tue, 4 Mar 2025 15:05:18 +0000 (UTC) X-FDA: 83184191916.21.3EBE3BF Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf24.hostedemail.com (Postfix) with ESMTP id 1F53B18000D for ; Tue, 4 Mar 2025 15:05:16 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf24.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741100717; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=K/4I1FWAK0Gz+hpZmFBcWWWAhCrvc2G8FaWno0kbrTQ=; b=Xz+fqqGLruCmGV3/9sLoGnRBbGVsFWXVxMOJP4L+u0EQLthGNaVq0QMCUe/qEFAiQknSk7 /mPw3kwSOj2FA/VrQEIDoqNk5KeNFq+17nGCvgqTAPb3zGektwoVoW3I0Zo5iWuN9De9Pa mQTGzJSA4JpMs+9xPt8OqiE0EL3JKMQ= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf24.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741100717; a=rsa-sha256; cv=none; b=qdAY7gCyeetqJ02JR/6co+ODRcBxrKE3a7Djs+coZnrugO6pXv83COampc5kSOT3jMbGsN vcPCXmDlCAptRVnRjQdGqQrh6oJ6Nsvh5pSYa6lSZ9ZHxYz0jHg2JlTmD1m5sJIIjP1Spl aJjQhi1RYU+CbydAD4qaWCvB2bZmdUY= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1F4C61C2B; Tue, 4 Mar 2025 07:05:30 -0800 (PST) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.27]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8D33D3F66E; Tue, 4 Mar 2025 07:05:14 -0800 (PST) From: Ryan Roberts To: Catalin Marinas , Will Deacon , Pasha Tatashin , Andrew Morton , Uladzislau Rezki , Christoph Hellwig , David Hildenbrand , "Matthew Wilcox (Oracle)" , Mark Rutland , Anshuman Khandual , Alexandre Ghiti , Kevin Brodsky Cc: Ryan Roberts , linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 10/11] mm/vmalloc: Enter lazy mmu mode while manipulating vmalloc ptes Date: Tue, 4 Mar 2025 15:04:40 +0000 Message-ID: <20250304150444.3788920-11-ryan.roberts@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250304150444.3788920-1-ryan.roberts@arm.com> References: <20250304150444.3788920-1-ryan.roberts@arm.com> MIME-Version: 1.0 X-Stat-Signature: 5bmkp33yp9b5y8ybfxiu9kot119wgiss X-Rspamd-Queue-Id: 1F53B18000D X-Rspamd-Server: rspam06 X-Rspam-User: X-HE-Tag: 1741100716-847096 X-HE-Meta: U2FsdGVkX18NinRT8X/LDNgjum6DVtqQ41iLXzBJyAtI1B4eNxFVBYY7+tswXqkH+NIcuxYWwJAslj+G7nCFF8T4Q54JTutVAJ/IDkjIEwZVCwrYAjgFGrIJDUoFTI0CqdqACwdozyi68YzGQdmvTNaVBxJ8aDAWPhAfb9um0UiiM7iSj4t6EwumFEuZkGQn27I5NlZeM+tWi8Wclkj7Q+iCxYww8Yc9AHBGq7mpNidofEjlasYek3+0JfPinjjGRuiRKut2TQECXr/aDr/1bUzzqt0NnGmjIK/k318yhkhfoVtGr2/4F+M9/UPZhAPDr2Jt6jM4Mv3EfWiQtahCDtK7i3W4x0ZD1M3c10stSKDEjVCURjSZzNeHPJAsQotpHlbCK4XoOcKec4b4ORBUdLoKoq+sqF3pnDCgTceYr4Fd3fzqTj7/oZvM0VTd2wKGWlkklX2MgMmhi/0lBYjWgpOi2J92t0kq0y42e4fW+bLLiA/C16asqNmxiVF/cwr98SdEZ1tElMTb9sTjxeE+elA2hOESAwC187179fSNfaPuZb/0csyTHSPTAla1cS8QK+Rub+JLvJJFrD2AVVPSCjuxeFI22CTPbAzSXJ+IzEawCGWWQUDgPvj8wJCJs8ZwaPEMS2qESZcQswXoaHntP9DHlbnpMyjTV3NVrwry9DmBWj5DQOh2MGk7Z9R55fEwWpaBGJsL4K8IxGgn+AqA/tnv6mSBAz6B2XHxF/WOLyJ3IowS2LPEz908wwP2RLE0UuJRS9uDwx/HXKalhXPlj4kdQjL8RjTQHkp3RZUxHG7s2lMTfBk46Cq0Dw1Tvt0Y2XVLI52V+6DUGBbmT+/kfElh2lOTpg6bYcQfUvq9oXeKt0s7cPSQZRtMYvdymDc74nc/vKDv9yrGhnNO2hSCnie/Ba4chJz9pwsNd0b0pemn5SnNG7YCQlvy8B1a2kiTyy387fcnYABbbXBTXMb Ir62QsH2 XFd3dcSNoNr8V5UoGccpHJNnY3EiorWB2VZm607GtWQVscirluXGr12aR7Oo2dM4a6m5HSURAnyBLqQB/vuQK62krzY+HxFUQlJnE2v8In0wIC7Vir7FRnjyPOl8XPtDDaqAExG1DIeNmCYylDPa3y3iDEA== 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: Wrap vmalloc's pte table manipulation loops with arch_enter_lazy_mmu_mode() / arch_leave_lazy_mmu_mode(). This provides the arch code with the opportunity to optimize the pte manipulations. Note that vmap_pfn() already uses lazy mmu mode since it delegates to apply_to_page_range() which enters lazy mmu mode for both user and kernel mappings. These hooks will shortly be used by arm64 to improve vmalloc performance. Signed-off-by: Ryan Roberts --- mm/vmalloc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 6111ce900ec4..b63ca0b7dd40 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -104,6 +104,9 @@ static int vmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, pte = pte_alloc_kernel_track(pmd, addr, mask); if (!pte) return -ENOMEM; + + arch_enter_lazy_mmu_mode(); + do { if (unlikely(!pte_none(ptep_get(pte)))) { if (pfn_valid(pfn)) { @@ -127,6 +130,8 @@ static int vmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, set_pte_at(&init_mm, addr, pte, pfn_pte(pfn, prot)); pfn++; } while (pte += PFN_DOWN(size), addr += size, addr != end); + + arch_leave_lazy_mmu_mode(); *mask |= PGTBL_PTE_MODIFIED; return 0; } @@ -354,6 +359,8 @@ static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, unsigned long size = PAGE_SIZE; pte = pte_offset_kernel(pmd, addr); + arch_enter_lazy_mmu_mode(); + do { #ifdef CONFIG_HUGETLB_PAGE size = arch_vmap_pte_range_unmap_size(addr, pte); @@ -370,6 +377,8 @@ static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, ptent = ptep_get_and_clear(&init_mm, addr, pte); WARN_ON(!pte_none(ptent) && !pte_present(ptent)); } while (pte += (size >> PAGE_SHIFT), addr += size, addr != end); + + arch_leave_lazy_mmu_mode(); *mask |= PGTBL_PTE_MODIFIED; } @@ -515,6 +524,9 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr, pte = pte_alloc_kernel_track(pmd, addr, mask); if (!pte) return -ENOMEM; + + arch_enter_lazy_mmu_mode(); + do { struct page *page = pages[*nr]; @@ -528,6 +540,8 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr, set_pte_at(&init_mm, addr, pte, mk_pte(page, prot)); (*nr)++; } while (pte++, addr += PAGE_SIZE, addr != end); + + arch_leave_lazy_mmu_mode(); *mask |= PGTBL_PTE_MODIFIED; return 0; }