From 644f7ec0f7628ae0740da2fd1a777f00e1fd5d91 Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Tue, 16 Mar 2021 15:58:54 -0400 Subject: [PATCH] uprobes rcu fix Signed-off-by: Liam R. Howlett --- kernel/events/uprobes.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 24cfa05e42ae..a2f84b8de83c 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -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) -- 2.50.1