|
@@ -340,9 +340,28 @@ int handle_userfault(struct vm_fault *vmf, unsigned long reason)
|
|
|
bool must_wait, return_to_userland;
|
|
|
long blocking_state;
|
|
|
|
|
|
- BUG_ON(!rwsem_is_locked(&mm->mmap_sem));
|
|
|
-
|
|
|
ret = VM_FAULT_SIGBUS;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We don't do userfault handling for the final child pid update.
|
|
|
+ *
|
|
|
+ * We also don't do userfault handling during
|
|
|
+ * coredumping. hugetlbfs has the special
|
|
|
+ * follow_hugetlb_page() to skip missing pages in the
|
|
|
+ * FOLL_DUMP case, anon memory also checks for FOLL_DUMP with
|
|
|
+ * the no_page_table() helper in follow_page_mask(), but the
|
|
|
+ * shmem_vm_ops->fault method is invoked even during
|
|
|
+ * coredumping without mmap_sem and it ends up here.
|
|
|
+ */
|
|
|
+ if (current->flags & (PF_EXITING|PF_DUMPCORE))
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Coredumping runs without mmap_sem so we can only check that
|
|
|
+ * the mmap_sem is held, if PF_DUMPCORE was not set.
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(!rwsem_is_locked(&mm->mmap_sem));
|
|
|
+
|
|
|
ctx = vmf->vma->vm_userfaultfd_ctx.ctx;
|
|
|
if (!ctx)
|
|
|
goto out;
|
|
@@ -360,12 +379,6 @@ int handle_userfault(struct vm_fault *vmf, unsigned long reason)
|
|
|
if (unlikely(ACCESS_ONCE(ctx->released)))
|
|
|
goto out;
|
|
|
|
|
|
- /*
|
|
|
- * We don't do userfault handling for the final child pid update.
|
|
|
- */
|
|
|
- if (current->flags & PF_EXITING)
|
|
|
- goto out;
|
|
|
-
|
|
|
/*
|
|
|
* Check that we can return VM_FAULT_RETRY.
|
|
|
*
|