[RFC 2/6] powerpc/mm/book3s64: Rework tlbie() to remove conditional locking

From: Ritesh Harjani (IBM)

Date: Mon Sep 28 2026 - 06:51:42 EST


Clang's context analysis reports:
hash_native.c:235:2: error: raw_spinlock 'native_tlbie_lock' is not held on every path through here [-Werror,-Wthread-safety-analysis]
hash_native.c:245:3: error: releasing raw_spinlock 'native_tlbie_lock' that was not held [-Werror,-Wthread-safety-analysis]

This patch reworks the tlbie() function to remove the conditional
locking. It fixes the clang context analysis reported errors. However,
this also simplifies the code around tlbie[l] - which is also a win.

No functional change intended.

Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@xxxxxxxxx>
---
arch/powerpc/mm/book3s64/hash_native.c | 34 ++++++++++++++++++--------
1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/mm/book3s64/hash_native.c b/arch/powerpc/mm/book3s64/hash_native.c
index ab2a80e59011..6bad0545b57a 100644
--- a/arch/powerpc/mm/book3s64/hash_native.c
+++ b/arch/powerpc/mm/book3s64/hash_native.c
@@ -222,6 +222,23 @@ static inline void __tlbiel(unsigned long vpn, int psize, int apsize, int ssize)

}

+static inline void __tlbie_sequence(unsigned long vpn, int psize, int apsize,
+ int ssize)
+{
+ asm volatile("ptesync": : :"memory");
+ __tlbie(vpn, psize, apsize, ssize);
+ fixup_tlbie_vpn(vpn, psize, apsize, ssize);
+ asm volatile("eieio; tlbsync; ptesync": : :"memory");
+}
+
+static inline void __tlbiel_sequence(unsigned long vpn, int psize, int apsize,
+ int ssize)
+{
+ asm volatile("ptesync": : :"memory");
+ __tlbiel(vpn, psize, apsize, ssize);
+ ppc_after_tlbiel_barrier();
+}
+
static inline void tlbie(unsigned long vpn, int psize, int apsize,
int ssize, int local)
{
@@ -230,19 +247,16 @@ static inline void tlbie(unsigned long vpn, int psize, int apsize,

if (use_local)
use_local = mmu_psize_defs[psize].tlbiel;
- if (lock_tlbie && !use_local)
- raw_spin_lock(&native_tlbie_lock);
- asm volatile("ptesync": : :"memory");
+
if (use_local) {
- __tlbiel(vpn, psize, apsize, ssize);
- ppc_after_tlbiel_barrier();
+ __tlbiel_sequence(vpn, psize, apsize, ssize);
+ } else if (lock_tlbie) {
+ raw_spin_lock(&native_tlbie_lock);
+ __tlbie_sequence(vpn, psize, apsize, ssize);
+ raw_spin_unlock(&native_tlbie_lock);
} else {
- __tlbie(vpn, psize, apsize, ssize);
- fixup_tlbie_vpn(vpn, psize, apsize, ssize);
- asm volatile("eieio; tlbsync; ptesync": : :"memory");
+ __tlbie_sequence(vpn, psize, apsize, ssize);
}
- if (lock_tlbie && !use_local)
- raw_spin_unlock(&native_tlbie_lock);
}

static inline void native_lock_hpte(struct hash_pte *hptep)
--
2.39.5