FAILED: patch "[PATCH] powerpc/64s/radix: Fix exit lazy tlb mm switch with irqs" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x dfaed3e1fa7099de8de4e89cbe7eb9c1bca27dfe
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023062330-dwarf-gazing-415c@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From dfaed3e1fa7099de8de4e89cbe7eb9c1bca27dfe Mon Sep 17 00:00:00 2001
From: Nicholas Piggin <[email protected]>
Date: Wed, 7 Jun 2023 10:56:00 +1000
Subject: [PATCH] powerpc/64s/radix: Fix exit lazy tlb mm switch with irqs
enabled
Switching mm and tinkering with current->active_mm should be done with irqs disabled. There is a path where exit_lazy_flush_tlb can be called with irqs enabled:
exit_lazy_flush_tlb
flush_type_needed
__flush_all_mm
tlb_finish_mmu
exit_mmapWhich results in the switching being done with irqs enabled, which is incorrect.
arch/powerpc/mm/book3s64/radix_tlb.c +9 -1
@@ -795,12 +795,20 @@ void exit_lazy_flush_tlb(struct mm_struct *mm, bool always_flush) goto out;if (current->active_mm == mm) { +unsigned long flags; +WARN_ON_ONCE (current->mm !=NULL ); -/* Is a kernel thread and is using mm as the lazy tlb */ +/* +* It is a kernel thread and is using mm as the lazy tlb, so +* switch it to init_mm. This is not always called from IPI +* (e.g., flush_type_needed), so must disable irqs. +*/ +local_irq_save (flags);mmgrab_lazy_tlb (&init_mm); current->active_mm = &init_mm;switch_mm_irqs_off (mm, &init_mm, current);mmdrop_lazy_tlb (mm); +local_irq_restore (flags); }/*