diff -drupN a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
--- a/arch/arm/mm/fault.c	2018-08-06 17:23:04.000000000 +0300
+++ b/arch/arm/mm/fault.c	2022-06-12 05:28:14.000000000 +0300
@@ -219,6 +219,25 @@ static inline bool access_error(unsigned
 	return vma->vm_flags & mask ? false : true;
 }
 
+static void aw_vma_pid_add(struct vm_area_struct *vma, pid_t pid)
+{
+	int i;
+
+	if (vma->access_vma_num > 62)
+		return;
+	if (vma->access_vma_num == 0) {
+		vma->access_vma_array[0] = pid;
+		vma->access_vma_num++;
+		return;
+	}
+	for (i = 0; i < vma->access_vma_num; i++) {
+		if (pid == vma->access_vma_array[i])
+			return;
+	}
+	vma->access_vma_array[vma->access_vma_num] = pid;
+	vma->access_vma_num++;
+}
+
 static int __kprobes
 __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
 		unsigned int flags, struct task_struct *tsk)
@@ -243,6 +262,7 @@ good_area:
 		goto out;
 	}
 
+	aw_vma_pid_add(vma, current->pid);
 	return handle_mm_fault(vma, addr & PAGE_MASK, flags);
 
 check_stack:
@@ -273,10 +293,10 @@ do_page_fault(unsigned long addr, unsign
 		local_irq_enable();
 
 	/*
-	 * If we're in an interrupt or have no user
+	 * If we're in an interrupt, or have no irqs, or have no user
 	 * context, we must not take the fault..
 	 */
-	if (faulthandler_disabled() || !mm)
+	if (faulthandler_disabled() || irqs_disabled() || !mm)
 		goto no_context;
 
 	if (user_mode(regs))