Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

arch: introduce set_direct_map_valid_noflush()

Add an API that will allow updates of the direct/linear map for a set of
physically contiguous pages.

It will be used in the following patches.

Link: https://lkml.kernel.org/r/20241023162711.2579610-6-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Tested-by: kdevops <kdevops@lists.linux.dev>
Cc: Andreas Larsson <andreas@gaisler.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Borislav Petkov (AMD) <bp@alien8.de>
Cc: Brian Cain <bcain@quicinc.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Dinh Nguyen <dinguyen@kernel.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Guo Ren <guoren@kernel.org>
Cc: Helge Deller <deller@gmx.de>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Kent Overstreet <kent.overstreet@linux.dev>
Cc: Liam R. Howlett <Liam.Howlett@Oracle.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Richard Weinberger <richard@nod.at>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Song Liu <song@kernel.org>
Cc: Stafford Horne <shorne@gmail.com>
Cc: Steven Rostedt (Google) <rostedt@goodmis.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Vineet Gupta <vgupta@kernel.org>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Mike Rapoport (Microsoft) and committed by
Andrew Morton
0c6378a7 0c133b1e

+74
+1
arch/arm64/include/asm/set_memory.h
··· 13 13 14 14 int set_direct_map_invalid_noflush(struct page *page); 15 15 int set_direct_map_default_noflush(struct page *page); 16 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid); 16 17 bool kernel_page_present(struct page *page); 17 18 18 19 #endif /* _ASM_ARM64_SET_MEMORY_H */
+10
arch/arm64/mm/pageattr.c
··· 192 192 PAGE_SIZE, change_page_range, &data); 193 193 } 194 194 195 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) 196 + { 197 + unsigned long addr = (unsigned long)page_address(page); 198 + 199 + if (!can_set_direct_map()) 200 + return 0; 201 + 202 + return set_memory_valid(addr, nr, valid); 203 + } 204 + 195 205 #ifdef CONFIG_DEBUG_PAGEALLOC 196 206 void __kernel_map_pages(struct page *page, int numpages, int enable) 197 207 {
+1
arch/loongarch/include/asm/set_memory.h
··· 17 17 bool kernel_page_present(struct page *page); 18 18 int set_direct_map_default_noflush(struct page *page); 19 19 int set_direct_map_invalid_noflush(struct page *page); 20 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid); 20 21 21 22 #endif /* _ASM_LOONGARCH_SET_MEMORY_H */
+19
arch/loongarch/mm/pageattr.c
··· 216 216 217 217 return __set_memory(addr, 1, __pgprot(0), __pgprot(_PAGE_PRESENT | _PAGE_VALID)); 218 218 } 219 + 220 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) 221 + { 222 + unsigned long addr = (unsigned long)page_address(page); 223 + pgprot_t set, clear; 224 + 225 + if (addr < vm_map_base) 226 + return 0; 227 + 228 + if (valid) { 229 + set = PAGE_KERNEL; 230 + clear = __pgprot(0); 231 + } else { 232 + set = __pgprot(0); 233 + clear = __pgprot(_PAGE_PRESENT | _PAGE_VALID); 234 + } 235 + 236 + return __set_memory(addr, 1, set, clear); 237 + }
+1
arch/riscv/include/asm/set_memory.h
··· 42 42 43 43 int set_direct_map_invalid_noflush(struct page *page); 44 44 int set_direct_map_default_noflush(struct page *page); 45 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid); 45 46 bool kernel_page_present(struct page *page); 46 47 47 48 #endif /* __ASSEMBLY__ */
+15
arch/riscv/mm/pageattr.c
··· 386 386 PAGE_KERNEL, __pgprot(_PAGE_EXEC)); 387 387 } 388 388 389 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) 390 + { 391 + pgprot_t set, clear; 392 + 393 + if (valid) { 394 + set = PAGE_KERNEL; 395 + clear = __pgprot(_PAGE_EXEC); 396 + } else { 397 + set = __pgprot(0); 398 + clear = __pgprot(_PAGE_PRESENT); 399 + } 400 + 401 + return __set_memory((unsigned long)page_address(page), nr, set, clear); 402 + } 403 + 389 404 #ifdef CONFIG_DEBUG_PAGEALLOC 390 405 static int debug_pagealloc_set_page(pte_t *pte, unsigned long addr, void *data) 391 406 {
+1
arch/s390/include/asm/set_memory.h
··· 62 62 63 63 int set_direct_map_invalid_noflush(struct page *page); 64 64 int set_direct_map_default_noflush(struct page *page); 65 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid); 65 66 66 67 #endif
+11
arch/s390/mm/pageattr.c
··· 406 406 return __set_memory((unsigned long)page_to_virt(page), 1, SET_MEMORY_DEF); 407 407 } 408 408 409 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) 410 + { 411 + unsigned long flags; 412 + 413 + if (valid) 414 + flags = SET_MEMORY_DEF; 415 + else 416 + flags = SET_MEMORY_INV; 417 + 418 + return __set_memory((unsigned long)page_to_virt(page), nr, flags); 419 + } 409 420 #if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE) 410 421 411 422 static void ipte_range(pte_t *pte, unsigned long address, int nr)
+1
arch/x86/include/asm/set_memory.h
··· 89 89 90 90 int set_direct_map_invalid_noflush(struct page *page); 91 91 int set_direct_map_default_noflush(struct page *page); 92 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid); 92 93 bool kernel_page_present(struct page *page); 93 94 94 95 extern int kernel_set_to_readonly;
+8
arch/x86/mm/pat/set_memory.c
··· 2444 2444 return __set_pages_p(page, 1); 2445 2445 } 2446 2446 2447 + int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) 2448 + { 2449 + if (valid) 2450 + return __set_pages_p(page, nr); 2451 + 2452 + return __set_pages_np(page, nr); 2453 + } 2454 + 2447 2455 #ifdef CONFIG_DEBUG_PAGEALLOC 2448 2456 void __kernel_map_pages(struct page *page, int numpages, int enable) 2449 2457 {
+6
include/linux/set_memory.h
··· 34 34 return 0; 35 35 } 36 36 37 + static inline int set_direct_map_valid_noflush(struct page *page, 38 + unsigned nr, bool valid) 39 + { 40 + return 0; 41 + } 42 + 37 43 static inline bool kernel_page_present(struct page *page) 38 44 { 39 45 return true;