From: Valentin Schneider <>
Date: Thu, 27 Jan 2022 19:24:37 +0000
Subject: [PATCH] arm64: mm: Make arch_faults_on_old_pte() check for

arch_faults_on_old_pte() relies on the calling context being
non-preemptible. CONFIG_PREEMPT_RT turns the PTE lock into a sleepable
spinlock, which doesn't disable preemption once acquired, triggering the
warning in arch_faults_on_old_pte().

It does however disable migration, ensuring the task remains on the same
CPU during the entirety of the critical section, making the read of
cpu_has_hw_af() safe and stable.

Make arch_faults_on_old_pte() check cant_migrate() instead of preemptible().

Suggested-by: Sebastian Andrzej Siewior <>
Signed-off-by: Valentin Schneider <>
Acked-by: Catalin Marinas <>
 arch/arm64/include/asm/pgtable.h |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -1001,7 +1001,8 @@ static inline void update_mmu_cache(stru
 static inline bool arch_faults_on_old_pte(void)
-	WARN_ON(preemptible());
+	/* The register read below requires a stable CPU to make any sense */
+	cant_migrate();
 	return !cpu_has_hw_af();