Clang's context analysis reports: subpage_prot.c:83:2: error: releasing spinlock 'ptl' that was not held [-Werror,-Wthread-safety-analysis]
pte_offset_map_lock() holds ptl when it returns a PTE and pte_unmap_unlock() drops it. However since the lock is taken inside the helper, which is not annotated, so the unlock in hpte_flush_range() looks unheld. This patch fixes it in hpte_flush_range() by adding the needed annotation here. IMO, should ideally be added to pte_offset_map_lock(), once that happens (since it might need larger enablement), we can remove it from here. Signed-off-by: Ritesh Harjani (IBM) <[email protected]> --- arch/powerpc/mm/book3s64/subpage_prot.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/powerpc/mm/book3s64/subpage_prot.c b/arch/powerpc/mm/book3s64/subpage_prot.c index 37d47282c368..d641c35c408d 100644 --- a/arch/powerpc/mm/book3s64/subpage_prot.c +++ b/arch/powerpc/mm/book3s64/subpage_prot.c @@ -73,6 +73,8 @@ static void hpte_flush_range(struct mm_struct *mm, unsigned long addr, pte = pte_offset_map_lock(mm, pmd, addr, &ptl); if (!pte) return; + /* pte_offset_map_lock on success returns with ptl lock held */ + __acquire(ptl); lazy_mmu_mode_enable(); for (; npages > 0; --npages) { pte_update(mm, addr, pte, 0, 0, 0); -- 2.39.5
