diff options
-rw-r--r-- | mm/userfaultfd.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 7e7fee431873..e8e8a7951c4a 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -664,6 +664,15 @@ retry: if (unlikely(err == -ENOENT)) { void *page_kaddr; + /* + * Return early due to mmap_lock contention only after + * some pages are copied to ensure that jank sensitive + * threads don't keep retrying for progress-critical + * pages. + */ + if (copied && mmap_lock_is_contended(dst_mm)) + break; + mmap_read_unlock(dst_mm); BUG_ON(!page); @@ -688,6 +697,9 @@ retry: if (fatal_signal_pending(current)) err = -EINTR; + + if (mmap_lock_is_contended(dst_mm)) + err = -EAGAIN; } if (err) break; |