]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
uprobes rcu fix
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 16 Mar 2021 19:58:54 +0000 (15:58 -0400)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 16 Mar 2021 19:58:54 +0000 (15:58 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
kernel/events/uprobes.c

index 24cfa05e42aed1336a07f4d25862cdabd035613d..a2f84b8de83c66bf7ddb481934b52f523cca18bb 100644 (file)
@@ -355,14 +355,16 @@ static bool valid_ref_ctr_vma(struct uprobe *uprobe,
 static struct vm_area_struct *
 find_ref_ctr_vma(struct uprobe *uprobe, struct mm_struct *mm)
 {
-       struct vm_area_struct *tmp;
+       struct vm_area_struct *tmp = NULL;
        MA_STATE(mas, &mm->mm_mt, 0, 0);
 
+       rcu_read_lock();
        mas_for_each(&mas, tmp, ULONG_MAX)
                if (valid_ref_ctr_vma(uprobe, tmp))
-                       return tmp;
+                       break;
+       rcu_read_unlock();
 
-       return NULL;
+       return tmp;
 }
 
 static int
@@ -1994,6 +1996,7 @@ static void mmf_recalc_uprobes(struct mm_struct *mm)
        struct vm_area_struct *vma;
        MA_STATE(mas, &mm->mm_mt, 0, 0);
 
+       rcu_read_lock();
        mas_for_each(&mas, vma, ULONG_MAX) {
                if (!valid_vma(vma, false))
                        continue;
@@ -2004,10 +2007,15 @@ static void mmf_recalc_uprobes(struct mm_struct *mm)
                 * Or this uprobe can be filtered out.
                 */
                if (vma_has_uprobes(vma, vma->vm_start, vma->vm_end))
-                       return;
+                       goto completed;
        }
+       rcu_read_unlock();
 
        clear_bit(MMF_HAS_UPROBES, &mm->flags);
+       return;
+
+completed:
+       rcu_read_unlock();
 }
 
 static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr)