diff --git a/mm/memory.c b/mm/memory.c
index ad4bf1a1a0efb4d41ad2b186c1d38af0a7625b64..53bd595798617a2bcab2f483b93bacb0464943cb 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -4344,7 +4344,9 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
 	void *old_buf = buf;
 	int write = gup_flags & FOLL_WRITE;
 
-	down_read(&mm->mmap_sem);
+	if (down_read_killable(&mm->mmap_sem))
+		return 0;
+
 	/* ignore errors, just check how much was successfully transferred */
 	while (len) {
 		int bytes, ret, offset;
diff --git a/mm/nommu.c b/mm/nommu.c
index 07165ad2e548d7c0cafecc1056c525df1ad5be44..eb3e2e558da13d85937ee5bd547ffd591708bf02 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1704,7 +1704,8 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
 	struct vm_area_struct *vma;
 	int write = gup_flags & FOLL_WRITE;
 
-	down_read(&mm->mmap_sem);
+	if (down_read_killable(&mm->mmap_sem))
+		return 0;
 
 	/* the access must start within one of the target process's mappings */
 	vma = find_vma(mm, addr);