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) <[email protected]> --- 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
