From: Sebastian Andrzej Siewior Date: Tue, 11 Nov 2025 15:54:37 +0000 (+0100) Subject: ARM: 9461/1: Disable HIGHPTE on PREEMPT_RT kernels X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fedadc4137234c3d00c4785eeed3e747fe9036ae;p=thirdparty%2Fkernel%2Flinux.git ARM: 9461/1: Disable HIGHPTE on PREEMPT_RT kernels gup_pgd_range() is invoked with disabled interrupts and invokes __kmap_local_page_prot() via pte_offset_map(), gup_p4d_range(). With HIGHPTE enabled, __kmap_local_page_prot() invokes kmap_high_get() which uses a spinlock_t via lock_kmap_any(). This leads to an sleeping-while-atomic error on PREEMPT_RT because spinlock_t becomes a sleeping lock and must not be acquired in atomic context. The loop in map_new_virtual() uses wait_queue_head_t for wake up which also is using a spinlock_t. Since HIGHPTE is rarely needed at all, turn it off for PREEMPT_RT to allow the use of get_user_pages_fast(). [arnd: rework patch to turn off HIGHPTE instead of HAVE_PAST_GUP] Co-developed-by: Arnd Bergmann Acked-by: Linus Walleij Reviewed-by: Arnd Bergmann Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Russell King (Oracle) --- diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 92ca24336ec4b..45d29320196f0 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1213,7 +1213,7 @@ config HIGHMEM config HIGHPTE bool "Allocate 2nd-level pagetables from highmem" if EXPERT - depends on HIGHMEM + depends on HIGHMEM && !PREEMPT_RT default y help The VM uses one page of physical memory for each page table.