mm: add RCU annotation to pte_offset_map(_lock)
authorPetr Malat <oss@malat.biz>
Tue, 10 Dec 2024 00:06:04 +0000 (01:06 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 19 Dec 2024 03:04:43 +0000 (19:04 -0800)
RCU lock is taken by ___pte_offset_map() unless it returns NULL.  Add this
information to its inline callers to avoid sparse warning about context
imbalance in pte_unmap().

Link: https://lkml.kernel.org/r/20241210000604.700710-1-oss@malat.biz
Signed-off-by: Petr Malat <oss@malat.biz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/mm.h
mm/pgtable-generic.c

index c39c4945946c6f7cc3401cec14bd382ca3cae3e8..3a6ee6a05aa004263a1719735f42ae03b0aeaaa1 100644 (file)
@@ -3010,7 +3010,15 @@ static inline void pagetable_pte_dtor(struct ptdesc *ptdesc)
        lruvec_stat_sub_folio(folio, NR_PAGETABLE);
 }
 
-pte_t *__pte_offset_map(pmd_t *pmd, unsigned long addr, pmd_t *pmdvalp);
+pte_t *___pte_offset_map(pmd_t *pmd, unsigned long addr, pmd_t *pmdvalp);
+static inline pte_t *__pte_offset_map(pmd_t *pmd, unsigned long addr,
+                       pmd_t *pmdvalp)
+{
+       pte_t *pte;
+
+       __cond_lock(RCU, pte = ___pte_offset_map(pmd, addr, pmdvalp));
+       return pte;
+}
 static inline pte_t *pte_offset_map(pmd_t *pmd, unsigned long addr)
 {
        return __pte_offset_map(pmd, addr, NULL);
@@ -3023,7 +3031,8 @@ static inline pte_t *pte_offset_map_lock(struct mm_struct *mm, pmd_t *pmd,
 {
        pte_t *pte;
 
-       __cond_lock(*ptlp, pte = __pte_offset_map_lock(mm, pmd, addr, ptlp));
+       __cond_lock(RCU, __cond_lock(*ptlp,
+                       pte = __pte_offset_map_lock(mm, pmd, addr, ptlp)));
        return pte;
 }
 
index 5297dcc38c37a9f96c148690d49e4250b6c5d07a..5a882f2b10f903891018ac4fb44a3b084658cea5 100644 (file)
@@ -279,7 +279,7 @@ static unsigned long pmdp_get_lockless_start(void) { return 0; }
 static void pmdp_get_lockless_end(unsigned long irqflags) { }
 #endif
 
-pte_t *__pte_offset_map(pmd_t *pmd, unsigned long addr, pmd_t *pmdvalp)
+pte_t *___pte_offset_map(pmd_t *pmd, unsigned long addr, pmd_t *pmdvalp)
 {
        unsigned long irqflags;
        pmd_t pmdval;