From nobody Mon Sep 28 22:31:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D6083DDAF0; Sun, 16 Aug 2026 10:59:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786877993; cv=none; b=oSVIOXZxW2z50nuuXU5lQlxQZmmXgoOAxHJLjVjmndv/V/o8SoUi989dfm0C88bYbTLO2QIqPojDk7QVCiBRm2CJd6+vDD1oF1DM01eN6lv4LQ4rEdFNRqwWuhzHYte9816wOur5ydzd4HD7XvlQhc6I5w5U8v6qO5cROuSvKQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786877993; c=relaxed/simple; bh=mhipINTB8QXVY81KXOCYSF8dUKqs1VouSl6MGmpgo4g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lV6U86iWPZLQOO7LZ5YhDhDPyUE8tg01pJJ75fRO+q2DITYRCNGtyH/DHe6dZy6Qb056JIUfVH1eJwN/EZnnUbUB47RuKBg/8nQP9aBh78UTWNY1Cpcz6msiaxdTE3XFxjmIA/3ylCzMuAaECX5aGao6jiZ98qHlGtlwUvdQLRU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OX3ebqv6; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OX3ebqv6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8FD931F00A3A; Sun, 16 Aug 2026 10:59:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786877989; bh=Y4tutYZL3rGYJJvWCursgBu/wlu5o4SWbU3bprQruhA=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=OX3ebqv67C69ElcUzq6wGYnWbMf+WIJl2UL1RoQbvo1zJBFMw+qPzWMTrjjntwRgc LAwWll+8jtVxtF82aEYnexNe+1lJUdVffXimYBKkXOttRjNoOY6EqaX8XSoz1M/E3y NGuEHjRTkA6rv0blozeKa+r59gABEoK2Vopo8izaTvkmQGKDLoJM5GHyZ0lphmEPwe o8Z7LALKLEj5yvKo7ZeFWeTSLgl4Zn6zLU1N30Eihb/ByCX9zQKfSnibW2XS83m/+4 ywunsURkesKrqb5G7DTcqoqbWAP08CaqqYzO5dKf5tk9eTQQ56S3sPcAb6LHaLcJId AaYYF1Go8SNAw== From: "Mike Rapoport (Microsoft)" Date: Sun, 16 Aug 2026 13:59:24 +0300 Subject: [PATCH 1/6] set_memory: add number of pages parameter to set_direct_map APIs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260816-execmem-set-vm-perms-v0-2-v1-1-90944a3ad43f@kernel.org> References: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> In-Reply-To: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> To: Andrew Morton Cc: =?utf-8?q?Adrian_Barna=C5=9B?= , Albert Ou , Alexander Gordeev , Alexandre Ghiti , Andy Lutomirski , Borislav Petkov , Brendan Jackman , Catalin Marinas , Christian Borntraeger , Dave Hansen , David Hildenbrand , Gerald Schaefer , Heiko Carstens , Huacai Chen , Ingo Molnar , Len Brown , Mike Rapoport , Palmer Dabbelt , Paul Walmsley , Pavel Machek , Peter Zijlstra , "H. Peter Anvin" , "Rafael J. Wysocki" , Ryan Roberts , Sven Schnelle , Thomas Gleixner , Uladzislau Rezki , Vasily Gorbik , WANG Xuerui , Will Deacon , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, loongarch@lists.linux.dev X-Mailer: b4 0.17-dev When set_direct_map APIs were introduced by the commit d253ca0c3865 ("x86/mm/cpa: Add set_direct_map_*() functions") the single page parameter made sense because the initial callers (vmalloc and hibernation) had sets of unsorted struct pages that required changes of their mappings in the direct map. Since there is an increasing demand for direct map manipulation and it is also desirable to be able to update larger physically contiguous mappings, for example an entire large folio, extend set_direct_map APIs to receive number of pages parameter. As there is still only a handful of callers, change the existing functions directly and update all the call sites rather than adding wrappers for single page case. Signed-off-by: Mike Rapoport (Microsoft) --- arch/arm64/include/asm/set_memory.h | 4 ++-- arch/arm64/mm/pageattr.c | 8 ++++---- arch/loongarch/include/asm/set_memory.h | 4 ++-- arch/loongarch/mm/pageattr.c | 8 ++++---- arch/riscv/include/asm/set_memory.h | 4 ++-- arch/riscv/mm/pageattr.c | 8 ++++---- arch/s390/include/asm/set_memory.h | 4 ++-- arch/s390/mm/pageattr.c | 8 ++++---- arch/x86/include/asm/set_memory.h | 4 ++-- arch/x86/mm/pat/set_memory.c | 8 ++++---- include/linux/set_memory.h | 6 ++++-- kernel/power/snapshot.c | 4 ++-- mm/secretmem.c | 6 +++--- mm/vmalloc.c | 5 +++-- 14 files changed, 42 insertions(+), 39 deletions(-) diff --git a/arch/arm64/include/asm/set_memory.h b/arch/arm64/include/asm/s= et_memory.h index 90f61b17275e..b07fd4e026ea 100644 --- a/arch/arm64/include/asm/set_memory.h +++ b/arch/arm64/include/asm/set_memory.h @@ -11,8 +11,8 @@ bool can_set_direct_map(void); =20 int set_memory_valid(unsigned long addr, int numpages, int enable); =20 -int set_direct_map_invalid_noflush(struct page *page); -int set_direct_map_default_noflush(struct page *page); +int set_direct_map_invalid_noflush(struct page *page, unsigned int numpage= s); +int set_direct_map_default_noflush(struct page *page, unsigned int numpage= s); int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index bbe98ac9ad8c..db8d60a84d14 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -251,7 +251,7 @@ int set_memory_valid(unsigned long addr, int numpages, = int enable) __pgprot(PTE_PRESENT_VALID_KERNEL)); } =20 -int set_direct_map_invalid_noflush(struct page *page) +int set_direct_map_invalid_noflush(struct page *page, unsigned int numpage= s) { pgprot_t clear_mask =3D __pgprot(PTE_PRESENT_VALID_KERNEL); pgprot_t set_mask =3D __pgprot(PTE_PRESENT_INVALID); @@ -260,10 +260,10 @@ int set_direct_map_invalid_noflush(struct page *page) return 0; =20 return update_range_prot((unsigned long)page_address(page), - PAGE_SIZE, set_mask, clear_mask); + PAGE_SIZE * numpages, set_mask, clear_mask); } =20 -int set_direct_map_default_noflush(struct page *page) +int set_direct_map_default_noflush(struct page *page, unsigned int numpage= s) { pgprot_t set_mask =3D __pgprot(PTE_PRESENT_VALID_KERNEL | PTE_WRITE); pgprot_t clear_mask =3D __pgprot(PTE_PRESENT_INVALID | PTE_RDONLY); @@ -272,7 +272,7 @@ int set_direct_map_default_noflush(struct page *page) return 0; =20 return update_range_prot((unsigned long)page_address(page), - PAGE_SIZE, set_mask, clear_mask); + PAGE_SIZE * numpages, set_mask, clear_mask); } =20 static int __set_memory_enc_dec(unsigned long addr, diff --git a/arch/loongarch/include/asm/set_memory.h b/arch/loongarch/inclu= de/asm/set_memory.h index 55dfaefd02c8..563aab92896e 100644 --- a/arch/loongarch/include/asm/set_memory.h +++ b/arch/loongarch/include/asm/set_memory.h @@ -15,8 +15,8 @@ int set_memory_ro(unsigned long addr, int numpages); int set_memory_rw(unsigned long addr, int numpages); =20 bool kernel_page_present(struct page *page); -int set_direct_map_default_noflush(struct page *page); -int set_direct_map_invalid_noflush(struct page *page); +int set_direct_map_default_noflush(struct page *page, unsigned int nr); +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); =20 #endif /* _ASM_LOONGARCH_SET_MEMORY_H */ diff --git a/arch/loongarch/mm/pageattr.c b/arch/loongarch/mm/pageattr.c index 614ccc7afccb..43ad2a104f19 100644 --- a/arch/loongarch/mm/pageattr.c +++ b/arch/loongarch/mm/pageattr.c @@ -198,24 +198,24 @@ bool kernel_page_present(struct page *page) return pte_present(ptep_get(pte)); } =20 -int set_direct_map_default_noflush(struct page *page) +int set_direct_map_default_noflush(struct page *page, unsigned int nr) { unsigned long addr =3D (unsigned long)page_address(page); =20 if (addr < vm_map_base) return 0; =20 - return __set_memory(addr, 1, PAGE_KERNEL, __pgprot(0)); + return __set_memory(addr, nr, PAGE_KERNEL, __pgprot(0)); } =20 -int set_direct_map_invalid_noflush(struct page *page) +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr) { unsigned long addr =3D (unsigned long)page_address(page); =20 if (addr < vm_map_base) return 0; =20 - return __set_memory(addr, 1, __pgprot(0), __pgprot(_PAGE_PRESENT | _PAGE_= VALID)); + return __set_memory(addr, nr, __pgprot(0), __pgprot(_PAGE_PRESENT | _PAGE= _VALID)); } =20 int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) diff --git a/arch/riscv/include/asm/set_memory.h b/arch/riscv/include/asm/s= et_memory.h index ef59e1716a2c..db1d0ed82b69 100644 --- a/arch/riscv/include/asm/set_memory.h +++ b/arch/riscv/include/asm/set_memory.h @@ -40,8 +40,8 @@ static inline int set_kernel_memory(char *startp, char *e= ndp, } #endif =20 -int set_direct_map_invalid_noflush(struct page *page); -int set_direct_map_default_noflush(struct page *page); +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); +int set_direct_map_default_noflush(struct page *page, unsigned int nr); int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 diff --git a/arch/riscv/mm/pageattr.c b/arch/riscv/mm/pageattr.c index 3f76db3d2769..20ef95b1d0c3 100644 --- a/arch/riscv/mm/pageattr.c +++ b/arch/riscv/mm/pageattr.c @@ -374,15 +374,15 @@ int set_memory_nx(unsigned long addr, int numpages) return __set_memory(addr, numpages, __pgprot(0), __pgprot(_PAGE_EXEC)); } =20 -int set_direct_map_invalid_noflush(struct page *page) +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr) { - return __set_memory((unsigned long)page_address(page), 1, + return __set_memory((unsigned long)page_address(page), nr, __pgprot(0), __pgprot(_PAGE_PRESENT)); } =20 -int set_direct_map_default_noflush(struct page *page) +int set_direct_map_default_noflush(struct page *page, unsigned int nr) { - return __set_memory((unsigned long)page_address(page), 1, + return __set_memory((unsigned long)page_address(page), nr, PAGE_KERNEL, __pgprot(_PAGE_EXEC)); } =20 diff --git a/arch/s390/include/asm/set_memory.h b/arch/s390/include/asm/set= _memory.h index 94092f4ae764..6b0aa9147ed8 100644 --- a/arch/s390/include/asm/set_memory.h +++ b/arch/s390/include/asm/set_memory.h @@ -60,8 +60,8 @@ __SET_MEMORY_FUNC(set_memory_rox, SET_MEMORY_RO | SET_MEM= ORY_X) __SET_MEMORY_FUNC(set_memory_rwnx, SET_MEMORY_RW | SET_MEMORY_NX) __SET_MEMORY_FUNC(set_memory_4k, SET_MEMORY_4K) =20 -int set_direct_map_invalid_noflush(struct page *page); -int set_direct_map_default_noflush(struct page *page); +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); +int set_direct_map_default_noflush(struct page *page, unsigned int nr); int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c index e6f788696dd1..02d992b251cb 100644 --- a/arch/s390/mm/pageattr.c +++ b/arch/s390/mm/pageattr.c @@ -387,14 +387,14 @@ int __set_memory(unsigned long addr, unsigned long nu= mpages, unsigned long flags return rc; } =20 -int set_direct_map_invalid_noflush(struct page *page) +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr) { - return __set_memory((unsigned long)page_to_virt(page), 1, SET_MEMORY_INV); + return __set_memory((unsigned long)page_to_virt(page), nr, SET_MEMORY_INV= ); } =20 -int set_direct_map_default_noflush(struct page *page) +int set_direct_map_default_noflush(struct page *page, unsigned int nr) { - return __set_memory((unsigned long)page_to_virt(page), 1, SET_MEMORY_DEF); + return __set_memory((unsigned long)page_to_virt(page), nr, SET_MEMORY_DEF= ); } =20 int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) diff --git a/arch/x86/include/asm/set_memory.h b/arch/x86/include/asm/set_m= emory.h index 4362c26aa992..0c4235d159f4 100644 --- a/arch/x86/include/asm/set_memory.h +++ b/arch/x86/include/asm/set_memory.h @@ -86,8 +86,8 @@ int set_pages_wb(struct page *page, int numpages); int set_pages_ro(struct page *page, int numpages); int set_pages_rw(struct page *page, int numpages); =20 -int set_direct_map_invalid_noflush(struct page *page); -int set_direct_map_default_noflush(struct page *page); +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); +int set_direct_map_default_noflush(struct page *page, unsigned int nr); int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c index 422ce7fba00c..9022354e26e9 100644 --- a/arch/x86/mm/pat/set_memory.c +++ b/arch/x86/mm/pat/set_memory.c @@ -2673,14 +2673,14 @@ static int __set_pages_np(struct page *page, int nu= mpages) return __change_page_attr_set_clr(&cpa, 1); } =20 -int set_direct_map_invalid_noflush(struct page *page) +int set_direct_map_invalid_noflush(struct page *page, unsigned int nr) { - return __set_pages_np(page, 1); + return __set_pages_np(page, nr); } =20 -int set_direct_map_default_noflush(struct page *page) +int set_direct_map_default_noflush(struct page *page, unsigned int nr) { - return __set_pages_p(page, 1); + return __set_pages_p(page, nr); } =20 int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) diff --git a/include/linux/set_memory.h b/include/linux/set_memory.h index 3030d9245f5a..0b77f1d7d8b9 100644 --- a/include/linux/set_memory.h +++ b/include/linux/set_memory.h @@ -25,11 +25,13 @@ static inline int set_memory_rox(unsigned long addr, in= t numpages) #endif =20 #ifndef CONFIG_ARCH_HAS_SET_DIRECT_MAP -static inline int set_direct_map_invalid_noflush(struct page *page) +static inline int set_direct_map_invalid_noflush(struct page *page, + unsigned int nr) { return 0; } -static inline int set_direct_map_default_noflush(struct page *page) +static inline int set_direct_map_default_noflush(struct page *page, + unsigned int nr) { return 0; } diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index d933b5b2c05d..89a8894dd260 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c @@ -88,7 +88,7 @@ static inline int hibernate_restore_unprotect_page(void *= page_address) {return 0 static inline void hibernate_map_page(struct page *page) { if (IS_ENABLED(CONFIG_ARCH_HAS_SET_DIRECT_MAP)) { - int ret =3D set_direct_map_default_noflush(page); + int ret =3D set_direct_map_default_noflush(page, 1); =20 if (ret) pr_warn_once("Failed to remap page\n"); @@ -101,7 +101,7 @@ static inline void hibernate_unmap_page(struct page *pa= ge) { if (IS_ENABLED(CONFIG_ARCH_HAS_SET_DIRECT_MAP)) { unsigned long addr =3D (unsigned long)page_address(page); - int ret =3D set_direct_map_invalid_noflush(page); + int ret =3D set_direct_map_invalid_noflush(page, 1); =20 if (ret) pr_warn_once("Failed to remap page\n"); diff --git a/mm/secretmem.c b/mm/secretmem.c index d29865075b6e..b073b780bd10 100644 --- a/mm/secretmem.c +++ b/mm/secretmem.c @@ -72,7 +72,7 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf) goto out; } =20 - err =3D set_direct_map_invalid_noflush(folio_page(folio, 0)); + err =3D set_direct_map_invalid_noflush(folio_page(folio, 0), 1); if (err) { folio_put(folio); ret =3D vmf_error(err); @@ -87,7 +87,7 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf) * already happened when we marked the page invalid * which guarantees that this call won't fail */ - set_direct_map_default_noflush(folio_page(folio, 0)); + set_direct_map_default_noflush(folio_page(folio, 0), 1); folio_put(folio); if (err =3D=3D -EEXIST) goto retry; @@ -151,7 +151,7 @@ static int secretmem_migrate_folio(struct address_space= *mapping, =20 static void secretmem_free_folio(struct folio *folio) { - set_direct_map_default_noflush(folio_page(folio, 0)); + set_direct_map_default_noflush(folio_page(folio, 0), 1); folio_zero_segment(folio, 0, folio_size(folio)); } =20 diff --git a/mm/vmalloc.c b/mm/vmalloc.c index bea9f76ed7e7..22566e0b6e38 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3358,14 +3358,15 @@ struct vm_struct *remove_vm_area(const void *addr) } =20 static inline void set_area_direct_map(const struct vm_struct *area, - int (*set_direct_map)(struct page *page)) + int (*set_direct_map)(struct page *page, + unsigned int nr)) { unsigned long i; =20 /* HUGE_VMALLOC passes small pages to set_direct_map */ for (i =3D 0; i < area->nr_pages; i++) if (page_address(area->pages[i])) - set_direct_map(area->pages[i]); + set_direct_map(area->pages[i], 1); } =20 /* --=20 2.53.0 From nobody Mon Sep 28 22:31:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7667633D4F3; Sun, 16 Aug 2026 10:59:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786877999; cv=none; b=KGkVdV0J0WZqku3k+a8WPpUCDyLk8GxbQ4LZXIGP0nUzT4QAv5HYiIPvo9dTz673ikrnOOEA7p7yMbtBGu/mCweF5zbJmSNQbW5akxYZ90xYEUEuU3i0h6lKyGerbCw1ZZKPpT31b+ueHzNyTQwcnArpdMriebKmuFS3fsnmS8g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786877999; c=relaxed/simple; bh=MSkLZFYgZnRUj+Ln0KAwO5164UUjRW5Ke6JrUxJKdf8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rx1HLfyRSy+tTBEO0gWb+W3dfte/IEPS4P0lfT+bRrGl4VpJIuNA3+KRm0rQ+pJH9yJkd8j3wVLps2mG8A95nd9OM+S+zpbW5j6b4U1gsOahOM0qbYMj/MomurSedgrpBJO9s/OV/i739NlBu/Y3bmeDrBXT78cFhXNbY7jkF1w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BxkOfn6V; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BxkOfn6V" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A9C301F000E9; Sun, 16 Aug 2026 10:59:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786877998; bh=0zXvRlHUb1dGVaacwG9Y/iGMhzo5Pl/L8wZbO2uLtAc=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=BxkOfn6VXnfpjzEv/q4Dlg5AnuN8R3AjObhLqH0Nhb8Qm+HMlKpfhw7MlM7pUcjpx j094iQDlHr8uFSOixHJALZDscK3HM5dSJjMTUZJSzGsE08HWLOUuOiScutS8UdHYdx jTRJq/AyQbxDXEqaKgGOqCLlryQeICddB3wgdUNgRhhhw5CfvMk9L+Ot1f/ozzREIb pduODEEIbS3L4UslReNxhI00hG/eu7x1ASfbqfi1c6Z+g+iXDQzIKXWBBFNaoU/pxl 5cmOMyKyPQBHzXHaWoFhw7byGMNzbh2WO3UiuFJSgyZSqt30xw1gIJC5WER1i8Dt3B Mh8FSD60GW7qg== From: "Mike Rapoport (Microsoft)" Date: Sun, 16 Aug 2026 13:59:25 +0300 Subject: [PATCH 2/6] mm/vmalloc: set area's page_order after allocation succeeds Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260816-execmem-set-vm-perms-v0-2-v1-2-90944a3ad43f@kernel.org> References: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> In-Reply-To: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> To: Andrew Morton Cc: =?utf-8?q?Adrian_Barna=C5=9B?= , Albert Ou , Alexander Gordeev , Alexandre Ghiti , Andy Lutomirski , Borislav Petkov , Brendan Jackman , Catalin Marinas , Christian Borntraeger , Dave Hansen , David Hildenbrand , Gerald Schaefer , Heiko Carstens , Huacai Chen , Ingo Molnar , Len Brown , Mike Rapoport , Palmer Dabbelt , Paul Walmsley , Pavel Machek , Peter Zijlstra , "H. Peter Anvin" , "Rafael J. Wysocki" , Ryan Roberts , Sven Schnelle , Thomas Gleixner , Uladzislau Rezki , Vasily Gorbik , WANG Xuerui , Will Deacon , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, loongarch@lists.linux.dev X-Mailer: b4 0.17-dev __vmalloc_area_node() calls set_vm_area_page_order() to set area's page_order before actually allocating pages to populate the area. If allocation of large pages in HUGE_VMAP case fails midway, this leaves the area with elevated page_order throughout the cleanup path. There is no actual issue with this because the only place that currently relies on area->page_order on the cleanup path is the loop calculating the direct map alias range in vm_reset_perms() and it anyway skips unpopulated pages. But having set_vm_area_page_order() in the middle of __vmalloc_area_node() makes things very obscure, hard to reason about and error prone against future changes of the cleanup path. Move the call to set_vm_area_page_order() after __vmalloc_area_node() succeeded where page order is guaranteed. Signed-off-by: Mike Rapoport (Microsoft) Reviewed-by: Uladzislau Rezki (Sony) --- mm/vmalloc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 22566e0b6e38..6822f0fe9583 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3901,8 +3901,7 @@ static void *__vmalloc_area_node(struct vm_struct *ar= ea, gfp_t gfp_mask, goto fail; } =20 - set_vm_area_page_order(area, page_shift - PAGE_SHIFT); - page_order =3D vm_area_page_order(area); + page_order =3D page_shift - PAGE_SHIFT; =20 /* * High-order nofail allocations are really expensive and @@ -4106,6 +4105,14 @@ void *__vmalloc_node_range_noprof(unsigned long size= , unsigned long align, if (!ret) goto fail; =20 + /* + * Set area->page_order once it's known exactly that the order of the + * pages the area contains. + * Even if we succeeded to partially populate the area with large pages, + * still treat the area as populated with order-0 pages. + */ + set_vm_area_page_order(area, shift - PAGE_SHIFT); + /* * Mark the pages as accessible, now that they are mapped. * The condition for setting KASAN_VMALLOC_INIT should complement the --=20 2.53.0 From nobody Mon Sep 28 22:31:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D1DF73DEFFE; Sun, 16 Aug 2026 11:00:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878008; cv=none; b=AlTzbYEQARcsMqBTnQnHnPnSpr20AKnwRYMdDubVnsaxaW6mycjHYlDIjtjBzZ5Ef7OHsFmNzRcDK8z4fL4A7uACTrhGczOwhqKZB9DPHGZUZK5a6vDYajYoCjb/3niDSh5862dH8IR5iuJf5hNwyk225DKmJORdXsL1Y+OG3bA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878008; c=relaxed/simple; bh=ozgrsiTGOYisD+hDwa3qYD5pKcpI6G3ZsYnz9nV8AtE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ecMSgSiJW/MKkoNwahbT0qFwRIFlsCn4S0mG91W7XkC/V7WvxKSViLgJG7ZKNNuSRMx6Z/8GljVFvbUGPWjbj2MHhf29CVZb8kAnZ22JY+iOvEUzfw2WaN4ZRVXcNdADH4GX3Zom5yzurYeumfI8Vd9Ei4G4aqhs0F1cCYyX+PA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lhcayokE; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lhcayokE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 90DB71F00A3A; Sun, 16 Aug 2026 10:59:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786878007; bh=gy2s2udgAuUOuqiiG581Z7vL2dnOoGEiogGjehxnVAI=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=lhcayokEj43ho0cwYwXSsPkKuYBPIh9x6hGmG7ih3uLsYURAu3S/D5HPbKqADyg3G Pn/qo1s8e+YdNqNPYFYKLnk3uW+Qxcn4pjWu+rILw26T1RvSQ9uzDkgh8ZGk5iaXjp 23V5pkiCv2OtGtQldL3UnMXwFTy1HAwZq3MNoDc0AVt84RmjXctY3LEIz5jZ/Nyfz7 CisMqAS9gASEjwdc+fUzDeXAsec3VmceqO25xO+htrehQM6I7hJXZYjTU5GAos6kla Bpmwk7AT9oICEYNjyjibk/sz26kXrKCZIv0ddB9GkmW6oMBTDXpZ32LXrEpJqOT6bW vt3YeZwG5M/tg== From: "Mike Rapoport (Microsoft)" Date: Sun, 16 Aug 2026 13:59:26 +0300 Subject: [PATCH 3/6] mm/vmalloc: constify vm parameter of get_vm_area_page_order() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260816-execmem-set-vm-perms-v0-2-v1-3-90944a3ad43f@kernel.org> References: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> In-Reply-To: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> To: Andrew Morton Cc: =?utf-8?q?Adrian_Barna=C5=9B?= , Albert Ou , Alexander Gordeev , Alexandre Ghiti , Andy Lutomirski , Borislav Petkov , Brendan Jackman , Catalin Marinas , Christian Borntraeger , Dave Hansen , David Hildenbrand , Gerald Schaefer , Heiko Carstens , Huacai Chen , Ingo Molnar , Len Brown , Mike Rapoport , Palmer Dabbelt , Paul Walmsley , Pavel Machek , Peter Zijlstra , "H. Peter Anvin" , "Rafael J. Wysocki" , Ryan Roberts , Sven Schnelle , Thomas Gleixner , Uladzislau Rezki , Vasily Gorbik , WANG Xuerui , Will Deacon , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, loongarch@lists.linux.dev X-Mailer: b4 0.17-dev get_vm_area_page_order() and vm_area_page_order() do not need to modify struct vm_struct passed to them. Constify the parameter. Signed-off-by: Mike Rapoport (Microsoft) Reviewed-by: Uladzislau Rezki (Sony) --- mm/vmalloc.c | 4 ++-- mm/vmalloc.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 6822f0fe9583..fc7993db4152 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3124,7 +3124,7 @@ EXPORT_SYMBOL(vm_map_ram); =20 static struct vm_struct *vmlist __initdata; =20 -static inline unsigned int vm_area_page_order(struct vm_struct *vm) +static inline unsigned int vm_area_page_order(const struct vm_struct *vm) { #ifdef CONFIG_HAVE_ARCH_HUGE_VMALLOC return vm->page_order; @@ -3133,7 +3133,7 @@ static inline unsigned int vm_area_page_order(struct = vm_struct *vm) #endif } =20 -unsigned int get_vm_area_page_order(struct vm_struct *vm) +unsigned int get_vm_area_page_order(const struct vm_struct *vm) { return vm_area_page_order(vm); } diff --git a/mm/vmalloc.h b/mm/vmalloc.h index 8866ddcff668..211869f36509 100644 --- a/mm/vmalloc.h +++ b/mm/vmalloc.h @@ -12,7 +12,7 @@ void __init vmalloc_init(void); int __must_check vmap_pages_range_noflush(unsigned long addr, unsigned lon= g end, pgprot_t prot, struct page **pages, unsigned int page_shift, gfp_t gfp_mask); -unsigned int get_vm_area_page_order(struct vm_struct *vm); +unsigned int get_vm_area_page_order(const struct vm_struct *vm); #else static inline void vmalloc_init(void) {} =20 --=20 2.53.0 From nobody Mon Sep 28 22:31:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 949CC3C9EED; Sun, 16 Aug 2026 11:00:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878017; cv=none; b=MHIeYjrXU9zjfQqocJnAlppACKlrWIwVmMbZ2CbJYaVrFgzvyxkH03QnVDjbeBGRrX+eM7Mb/qtTzCQyLFlz9nDqkvkCwTWaZOYoW7C4pBkmk8QOmAbn50RPZXkPjAVJmUK9GZ/HQBLqEjAMda+C95jIkst0LWxyBCiN8B8UAME= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878017; c=relaxed/simple; bh=UmhtuD89qvz0ko0YInjebJPc8jbDcISaWIEEz8ESWhk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BG6vYvGo70ZFh3XUFn8MscfTcg+AUqAmo3185+dwfUQiiEYxCda+SL38Z40wcryXUaMdk7x9dxIXvJb192IvYxnewsMC1aR2CBYR/Dlwk+22A3u6Zl2CZrMPxHt2BkPa+r/ZozrFVxB0NoSWr1AMVnLzUCAta4yfVU+xiZbFp1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Wn2tZkv2; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Wn2tZkv2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC81B1F000E9; Sun, 16 Aug 2026 11:00:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786878016; bh=pVPiYTx5xsmZOnMUcbrtteXSXwIvJir7dW3VRw6OI/o=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Wn2tZkv2GmmvVvChb74RK7g+ieOJXoK9nRUtAwcKG1NxkbRbiQnwxuFtGfZc934GF ojnGXmG2CmOzyYd4WRDvKp74bLte24Nxofl5tovKCDjJt8Klp3pt15WXlZF0xsKWd/ VAZrWr9rmwXSRxftpWSw5h1IkcUwmiJS2YwRKrOxgPSde0/kgHE18LZwznsC9zVKob RkLvq8BCC+Cb38ljwdvLoIU5DXXQkdqpAZkhq6nlU183ZRgqoCY/nK3PbTrZgcsh+x gKDjsg7+EFabNEvmBTKl2HgmFZfhiaPb85PFS+49KLaXDpFuB/mB1UDggWiTDWKvSb sgZxxI00zoBMg== From: "Mike Rapoport (Microsoft)" Date: Sun, 16 Aug 2026 13:59:27 +0300 Subject: [PATCH 4/6] mm/vmalloc: make set_area_direct_map HUGE_VMAP friendly Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260816-execmem-set-vm-perms-v0-2-v1-4-90944a3ad43f@kernel.org> References: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> In-Reply-To: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> To: Andrew Morton Cc: =?utf-8?q?Adrian_Barna=C5=9B?= , Albert Ou , Alexander Gordeev , Alexandre Ghiti , Andy Lutomirski , Borislav Petkov , Brendan Jackman , Catalin Marinas , Christian Borntraeger , Dave Hansen , David Hildenbrand , Gerald Schaefer , Heiko Carstens , Huacai Chen , Ingo Molnar , Len Brown , Mike Rapoport , Palmer Dabbelt , Paul Walmsley , Pavel Machek , Peter Zijlstra , "H. Peter Anvin" , "Rafael J. Wysocki" , Ryan Roberts , Sven Schnelle , Thomas Gleixner , Uladzislau Rezki , Vasily Gorbik , WANG Xuerui , Will Deacon , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, loongarch@lists.linux.dev X-Mailer: b4 0.17-dev set_area_direct_map() always updates direct map alias permissions in single page increments. For HUGE_VMAP areas it's suboptimal. Not only the loop in set_area_direct_map() needlessly has more iterations (e.g times 512 on x86), but it also causes fragmentation of the direct map that could be avoided for the HUGE_VMAP areas populated with large pages. All pages in an area are always of the same order: either same-order large pages when VM_ALLOW_HUGE_VMAP is set and all huge pages were successfully allocated, or order-0 page when VM_ALLOW_HUGE_VMAP is cleared or when huge pages allocation fails and fallback path is taken. Instead of updating the direct map permissions for every order-0 page in an area, use the area's page_order as the loop increment and update the large pages in one call to set_direct_map_{invalid,default}_noflush(). Signed-off-by: Mike Rapoport (Microsoft) --- mm/vmalloc.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index fc7993db4152..11170d1ee5be 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3361,12 +3361,15 @@ static inline void set_area_direct_map(const struct= vm_struct *area, int (*set_direct_map)(struct page *page, unsigned int nr)) { - unsigned long i; + unsigned int nr =3D (1U << vm_area_page_order(area)); + + for (unsigned long i =3D 0; i < area->nr_pages; i +=3D nr) { + if (page_address(area->pages[i])) { + int err =3D set_direct_map(area->pages[i], nr); =20 - /* HUGE_VMALLOC passes small pages to set_direct_map */ - for (i =3D 0; i < area->nr_pages; i++) - if (page_address(area->pages[i])) - set_direct_map(area->pages[i], 1); + WARN_ON_ONCE(err); + } + } } =20 /* --=20 2.53.0 From nobody Mon Sep 28 22:31:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 841043DFC61; Sun, 16 Aug 2026 11:00:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878026; cv=none; b=Yk6ZO6Hf/+NL0Uw1wqOy3/mtDfSVQWrBqwxhtyCH2rVWMyymjrL8/+IWj9FJVFh2OUNo3jvEV3c2so29zjVrK3J8orNMob40kt35ZRNnVPbMA2gWKsQ2nwe02xzkbE90oWItAhgigImttQXET1ItJIHlC0JvF4v+2oqF6gIwAkw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878026; c=relaxed/simple; bh=q3A23n1w2OG/lXXU9CfkkQZfQRejkQM/lQ5Dh1nUPzQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PQxWs06I8O/XjBMU7XxMd8pymarG6MyWyHt9w3APjLlTkFx4Msv/lFWYGUluecRczBas7W6rJj3jexUhiMsRKqzXrH4BiRmRYRWeSR1ZbUBr8UzVGPzwKJMrNzgFjkr/Hooqd7GfBp23MOd6yCnu9vz08pP9hwk5Q3rV11Mw7fg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HFSkd1RR; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HFSkd1RR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B6F581F00A3A; Sun, 16 Aug 2026 11:00:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786878025; bh=VP6xAszPN9d5Ab+tWR5O9C7cLz2aPGLpAHH/Gr7UO8o=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=HFSkd1RRaS8oPDbWpyqD3+MFUAGz+zBb2E4buzBKvFx4juV0omhsnE2xW83orpu8H 9mAI5h2ZeMhHUsu1Goyi//25wRfRhy5/zldEwqXn+KNf83EMUEv8zRoPeHlgoEQi4V Oa7He8g8qJb2QsEPd1rl39eDbGrMOa8l2swjLNSuJmfqyBVg6W6hz4yFrG1D7pxBnS jwx2+tbyLbsmJcoFViUpm9otjM5Wr+gsaeyRAOH+WJPnI93lfF4TC3uGZWKpXyI+Os rTissIIc+9xMzfFeruWhWw0+3hN5L3fSFuS7lY2WLAPAG3gfVSviK2591GlnaNdjre Mmxv9eXrtRVBw== From: "Mike Rapoport (Microsoft)" Date: Sun, 16 Aug 2026 13:59:28 +0300 Subject: [PATCH 5/6] mm/execmem: use VM_FLUSH_RESET_PERMS for ROX cache allocations Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260816-execmem-set-vm-perms-v0-2-v1-5-90944a3ad43f@kernel.org> References: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> In-Reply-To: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> To: Andrew Morton Cc: =?utf-8?q?Adrian_Barna=C5=9B?= , Albert Ou , Alexander Gordeev , Alexandre Ghiti , Andy Lutomirski , Borislav Petkov , Brendan Jackman , Catalin Marinas , Christian Borntraeger , Dave Hansen , David Hildenbrand , Gerald Schaefer , Heiko Carstens , Huacai Chen , Ingo Molnar , Len Brown , Mike Rapoport , Palmer Dabbelt , Paul Walmsley , Pavel Machek , Peter Zijlstra , "H. Peter Anvin" , "Rafael J. Wysocki" , Ryan Roberts , Sven Schnelle , Thomas Gleixner , Uladzislau Rezki , Vasily Gorbik , WANG Xuerui , Will Deacon , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, loongarch@lists.linux.dev X-Mailer: b4 0.17-dev Initially execmem completely removed direct map alias for the memory allocated for the ROX cache in PMD_SIZE chunks. When that memory was freed, its direct map was restored also in PMD_SIZE chunks to avoid fragmentation of the direct map caused by vmalloc::vm_reset_perms(). This required execmem to implement the wrappers for set_direct_map APIs for proper sequencing of removal and restoration of the direct map aliases. Since then x86's CPA gained support for collapsing the direct map page tables for ROX pages and execmem switched from removing ROX caches from the direct map to making them ROX there, so execmem only needs to update direct map alias permissions when freeing the ROX cache memory. vmalloc already handles those updates for areas with VM_FLUSH_RESET_PERMS set and vmalloc::vm_reset_perms() does not force split of the direct map for PMD_SIZE chunks. Make all execmem vmalloc allocations use VM_FLUSH_RESET_PERMS and remove custom wrappers for set_direct_map APIs. Signed-off-by: Mike Rapoport (Microsoft) --- mm/execmem.c | 42 +++++++----------------------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/mm/execmem.c b/mm/execmem.c index 74a178a87e75..d35f1d0ea54a 100644 --- a/mm/execmem.c +++ b/mm/execmem.c @@ -36,6 +36,7 @@ static void *execmem_vmalloc(struct execmem_range *range,= size_t size, unsigned long end =3D range->end; void *p; =20 + vm_flags |=3D VM_FLUSH_RESET_PERMS; if (kasan) vm_flags |=3D VM_DEFER_KMEMLEAK; =20 @@ -113,28 +114,6 @@ static inline unsigned long mas_range_len(struct ma_st= ate *mas) return mas->last - mas->index + 1; } =20 -static int execmem_set_direct_map_valid(struct vm_struct *vm, bool valid) -{ - unsigned int nr =3D (1 << get_vm_area_page_order(vm)); - unsigned int updated =3D 0; - int err =3D 0; - - for (int i =3D 0; i < vm->nr_pages; i +=3D nr) { - err =3D set_direct_map_valid_noflush(vm->pages[i], nr, valid); - if (err) - goto err_restore; - updated +=3D nr; - } - - return 0; - -err_restore: - for (int i =3D 0; i < updated; i +=3D nr) - set_direct_map_valid_noflush(vm->pages[i], nr, !valid); - - return err; -} - static int execmem_force_rw(void *ptr, size_t size) { unsigned int nr =3D PAGE_ALIGN(size) >> PAGE_SHIFT; @@ -169,9 +148,6 @@ static void execmem_cache_clean(struct work_struct *wor= k) =20 if (IS_ALIGNED(size, PMD_SIZE) && IS_ALIGNED(mas.index, PMD_SIZE)) { - struct vm_struct *vm =3D find_vm_area(area); - - execmem_set_direct_map_valid(vm, true); mas_store_gfp(&mas, NULL, GFP_KERNEL); vfree(area); } @@ -312,18 +288,15 @@ static void *execmem_cache_populate_alloc(struct exec= mem_range *range, size_t si */ mutex_lock(mutex); err =3D execmem_cache_add_locked(p, alloc_size, GFP_KERNEL); - if (err) - goto err_reset_direct_map; - - p =3D execmem_cache_alloc_locked(range, size); - + if (!err) + p =3D execmem_cache_alloc_locked(range, size); mutex_unlock(mutex); =20 + if (err) + goto err_free_mem; + return p; =20 -err_reset_direct_map: - mutex_unlock(mutex); - execmem_set_direct_map_valid(vm, true); err_free_mem: vfree(p); return NULL; @@ -466,7 +439,6 @@ void *execmem_alloc(enum execmem_type type, size_t size) { struct execmem_range *range =3D &execmem_info->ranges[type]; bool use_cache =3D range->flags & EXECMEM_ROX_CACHE; - unsigned long vm_flags =3D VM_FLUSH_RESET_PERMS; pgprot_t pgprot =3D range->pgprot; void *p =3D NULL; =20 @@ -475,7 +447,7 @@ void *execmem_alloc(enum execmem_type type, size_t size) if (use_cache) p =3D execmem_cache_alloc(range, size); else - p =3D execmem_vmalloc(range, size, pgprot, vm_flags); + p =3D execmem_vmalloc(range, size, pgprot, 0); =20 return kasan_reset_tag(p); } --=20 2.53.0 From nobody Mon Sep 28 22:31:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 45B443DE425; Sun, 16 Aug 2026 11:00:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878036; cv=none; b=gQNqQyerH94iavtPiTkEwB05j2RjXQQ9ujWp1tJBB+vw051KkjrKzMB2mf4gNVZuyycS1T5Cy1JNktWHlGCMPLFWbk7H9HBbba4IBoQWMdjnoJR+UetMaRfySpIAwMGUosC0bfz7v/1jATjz8zsVhVsaeFE3fm1ezr+EOsMZsT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786878036; c=relaxed/simple; bh=2cQCYdpJ66YdX8fhPDCZdqhih6Kgw3bFryKEbEPqCys=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uJdt5pczoJ4RdD8+i7PKW66oH1YRr9K1bvgfjaTNgjs8cPVu2s1gC0ZhPeP0uqvmR6lSafAxFCgEHcuzdrvFUDT25uFWPEiHmei5b55rdl4fEjdF2AyJ9MU9nUYUIKwX3k6iivXNr9m3GiIGrW70OFUm7GrQnNC44xQ6qT4jaMU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=P9+LCIok; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="P9+LCIok" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9E4551F00A3D; Sun, 16 Aug 2026 11:00:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786878034; bh=1IKL46JfxrcOqE7Q7MesTGEIIR01Ean6sDupkVMBBfo=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=P9+LCIokkZwCxlCXxUfmKZtBV+2ZFYeAUSRtldsh+4ZQEIUC27Nsf54Liq5GxaM39 YfPY+8QsJ7oU1AkJ98+FaB1liInriqrdmg6QGU8AR80VSGfFnkXvRwRAfZZDI/Jomu kIwM1dSZLvEQt5yrvnxc+jGnvV4ktJCRFXK5ZYNpGsarsXvQygnusynQSHHUvXQuvr u2HkLuP3TYOjS8eUNjbzEQoagVGwjjUt1C3gymqNh2BABKqw/jb0fWEDz2ZC6l8jCO V5y4YFqIBqtBOeZJhmgcCc4QKD+EqboPW166BiKASPMgifH3tNoZdWwW83tBvwr6c8 hnja77sN6qqDA== From: "Mike Rapoport (Microsoft)" Date: Sun, 16 Aug 2026 13:59:29 +0300 Subject: [PATCH 6/6] Revert "arch: introduce set_direct_map_valid_noflush()" Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260816-execmem-set-vm-perms-v0-2-v1-6-90944a3ad43f@kernel.org> References: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> In-Reply-To: <20260816-execmem-set-vm-perms-v0-2-v1-0-90944a3ad43f@kernel.org> To: Andrew Morton Cc: =?utf-8?q?Adrian_Barna=C5=9B?= , Albert Ou , Alexander Gordeev , Alexandre Ghiti , Andy Lutomirski , Borislav Petkov , Brendan Jackman , Catalin Marinas , Christian Borntraeger , Dave Hansen , David Hildenbrand , Gerald Schaefer , Heiko Carstens , Huacai Chen , Ingo Molnar , Len Brown , Mike Rapoport , Palmer Dabbelt , Paul Walmsley , Pavel Machek , Peter Zijlstra , "H. Peter Anvin" , "Rafael J. Wysocki" , Ryan Roberts , Sven Schnelle , Thomas Gleixner , Uladzislau Rezki , Vasily Gorbik , WANG Xuerui , Will Deacon , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, loongarch@lists.linux.dev X-Mailer: b4 0.17-dev Commit 0c6378a71574 ("arch: introduce set_direct_map_valid_noflush()") added set_direct_map_valid_noflush() to allow updating the direct map for a physically contiguous range in execmem. As Brendan recently pointed out [1], this API is confusing because on arm64 it means that is sets VALID bit in ptes, while on other architectures it is an analog of set_direct_map_default_noflush(). The only user of set_direct_map_valid_noflush() was execmem's ROX cache freeing path and it was switched to utilize VM_FLUSH_RESET_PERMS for resetting permissions of the direct map alias. With the last user gone and with set_direct_map_{invalid,default}_noflush() accepting number of pages as a parameter, set_direct_map_valid_noflush() become a copy of set_memory_valid() on arm64 and a duplicate of set_direct_map_{invalid,default}_noflush() on other architecture, it is safe to remove set_direct_map_valid_noflush(). Also drop a stale comment in arm64::__kernel_map_pages() that Linus bothered to add when merging changes containing set_direct_map_valid_noflus= h() to his tree. This reverts commit 0c6378a71574daa6cd1534ad42a956e3262756c7. [1] https://lore.kernel.org/all/DJ69RCVRBO0Y.3JCYSW50IC4RC@linux.dev Signed-off-by: Mike Rapoport (Microsoft) Reviewed-by: Brendan Jackman --- arch/arm64/include/asm/set_memory.h | 1 - arch/arm64/mm/pageattr.c | 16 ---------------- arch/loongarch/include/asm/set_memory.h | 1 - arch/loongarch/mm/pageattr.c | 19 ------------------- arch/riscv/include/asm/set_memory.h | 1 - arch/riscv/mm/pageattr.c | 15 --------------- arch/s390/include/asm/set_memory.h | 1 - arch/s390/mm/pageattr.c | 12 ------------ arch/x86/include/asm/set_memory.h | 1 - arch/x86/mm/pat/set_memory.c | 8 -------- include/linux/set_memory.h | 6 ------ 11 files changed, 81 deletions(-) diff --git a/arch/arm64/include/asm/set_memory.h b/arch/arm64/include/asm/s= et_memory.h index b07fd4e026ea..0091ba12200e 100644 --- a/arch/arm64/include/asm/set_memory.h +++ b/arch/arm64/include/asm/set_memory.h @@ -13,7 +13,6 @@ int set_memory_valid(unsigned long addr, int numpages, in= t enable); =20 int set_direct_map_invalid_noflush(struct page *page, unsigned int numpage= s); int set_direct_map_default_noflush(struct page *page, unsigned int numpage= s); -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 int set_memory_encrypted(unsigned long addr, int numpages); diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index db8d60a84d14..132938b32eb1 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -355,23 +355,7 @@ int realm_register_memory_enc_ops(void) return arm64_mem_crypt_ops_register(&realm_crypt_ops); } =20 -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) -{ - unsigned long addr =3D (unsigned long)page_address(page); - - if (!can_set_direct_map()) - return 0; - - return set_memory_valid(addr, nr, valid); -} - #ifdef CONFIG_DEBUG_PAGEALLOC -/* - * This is - apart from the return value - doing the same - * thing as the new set_direct_map_valid_noflush() function. - * - * Unify? Explain the conceptual differences? - */ void __kernel_map_pages(struct page *page, int numpages, int enable) { if (!can_set_direct_map()) diff --git a/arch/loongarch/include/asm/set_memory.h b/arch/loongarch/inclu= de/asm/set_memory.h index 563aab92896e..4bb01172fbc2 100644 --- a/arch/loongarch/include/asm/set_memory.h +++ b/arch/loongarch/include/asm/set_memory.h @@ -17,6 +17,5 @@ int set_memory_rw(unsigned long addr, int numpages); bool kernel_page_present(struct page *page); int set_direct_map_default_noflush(struct page *page, unsigned int nr); int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); =20 #endif /* _ASM_LOONGARCH_SET_MEMORY_H */ diff --git a/arch/loongarch/mm/pageattr.c b/arch/loongarch/mm/pageattr.c index 43ad2a104f19..a7dcff40f759 100644 --- a/arch/loongarch/mm/pageattr.c +++ b/arch/loongarch/mm/pageattr.c @@ -217,22 +217,3 @@ int set_direct_map_invalid_noflush(struct page *page, = unsigned int nr) =20 return __set_memory(addr, nr, __pgprot(0), __pgprot(_PAGE_PRESENT | _PAGE= _VALID)); } - -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) -{ - unsigned long addr =3D (unsigned long)page_address(page); - pgprot_t set, clear; - - if (addr < vm_map_base) - return 0; - - if (valid) { - set =3D PAGE_KERNEL; - clear =3D __pgprot(0); - } else { - set =3D __pgprot(0); - clear =3D __pgprot(_PAGE_PRESENT | _PAGE_VALID); - } - - return __set_memory(addr, nr, set, clear); -} diff --git a/arch/riscv/include/asm/set_memory.h b/arch/riscv/include/asm/s= et_memory.h index db1d0ed82b69..e9f9960c1947 100644 --- a/arch/riscv/include/asm/set_memory.h +++ b/arch/riscv/include/asm/set_memory.h @@ -42,7 +42,6 @@ static inline int set_kernel_memory(char *startp, char *e= ndp, =20 int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); int set_direct_map_default_noflush(struct page *page, unsigned int nr); -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 #endif /* __ASSEMBLER__ */ diff --git a/arch/riscv/mm/pageattr.c b/arch/riscv/mm/pageattr.c index 20ef95b1d0c3..5b3cf326455d 100644 --- a/arch/riscv/mm/pageattr.c +++ b/arch/riscv/mm/pageattr.c @@ -386,21 +386,6 @@ int set_direct_map_default_noflush(struct page *page, = unsigned int nr) PAGE_KERNEL, __pgprot(_PAGE_EXEC)); } =20 -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) -{ - pgprot_t set, clear; - - if (valid) { - set =3D PAGE_KERNEL; - clear =3D __pgprot(_PAGE_EXEC); - } else { - set =3D __pgprot(0); - clear =3D __pgprot(_PAGE_PRESENT); - } - - return __set_memory((unsigned long)page_address(page), nr, set, clear); -} - #ifdef CONFIG_DEBUG_PAGEALLOC static int debug_pagealloc_set_page(pte_t *pte, unsigned long addr, void *= data) { diff --git a/arch/s390/include/asm/set_memory.h b/arch/s390/include/asm/set= _memory.h index 6b0aa9147ed8..e3562bf0c1aa 100644 --- a/arch/s390/include/asm/set_memory.h +++ b/arch/s390/include/asm/set_memory.h @@ -62,7 +62,6 @@ __SET_MEMORY_FUNC(set_memory_4k, SET_MEMORY_4K) =20 int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); int set_direct_map_default_noflush(struct page *page, unsigned int nr); -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 #endif diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c index 02d992b251cb..f46a666bc5c7 100644 --- a/arch/s390/mm/pageattr.c +++ b/arch/s390/mm/pageattr.c @@ -397,18 +397,6 @@ int set_direct_map_default_noflush(struct page *page, = unsigned int nr) return __set_memory((unsigned long)page_to_virt(page), nr, SET_MEMORY_DEF= ); } =20 -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) -{ - unsigned long flags; - - if (valid) - flags =3D SET_MEMORY_DEF; - else - flags =3D SET_MEMORY_INV; - - return __set_memory((unsigned long)page_to_virt(page), nr, flags); -} - bool kernel_page_present(struct page *page) { unsigned long addr; diff --git a/arch/x86/include/asm/set_memory.h b/arch/x86/include/asm/set_m= emory.h index 0c4235d159f4..39271a5ea925 100644 --- a/arch/x86/include/asm/set_memory.h +++ b/arch/x86/include/asm/set_memory.h @@ -88,7 +88,6 @@ int set_pages_rw(struct page *page, int numpages); =20 int set_direct_map_invalid_noflush(struct page *page, unsigned int nr); int set_direct_map_default_noflush(struct page *page, unsigned int nr); -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 extern int kernel_set_to_readonly; diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c index 9022354e26e9..a6b2912a4837 100644 --- a/arch/x86/mm/pat/set_memory.c +++ b/arch/x86/mm/pat/set_memory.c @@ -2683,14 +2683,6 @@ int set_direct_map_default_noflush(struct page *page= , unsigned int nr) return __set_pages_p(page, nr); } =20 -int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) -{ - if (valid) - return __set_pages_p(page, nr); - - return __set_pages_np(page, nr); -} - #ifdef CONFIG_DEBUG_PAGEALLOC void __kernel_map_pages(struct page *page, int numpages, int enable) { diff --git a/include/linux/set_memory.h b/include/linux/set_memory.h index 0b77f1d7d8b9..3fe293cfed8c 100644 --- a/include/linux/set_memory.h +++ b/include/linux/set_memory.h @@ -36,12 +36,6 @@ static inline int set_direct_map_default_noflush(struct = page *page, return 0; } =20 -static inline int set_direct_map_valid_noflush(struct page *page, - unsigned nr, bool valid) -{ - return 0; -} - static inline bool kernel_page_present(struct page *page) { return true; --=20 2.53.0