|
@@ -414,7 +414,10 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
|
|
unsigned long charge;
|
|
|
|
|
|
uprobe_start_dup_mmap();
|
|
|
- down_write(&oldmm->mmap_sem);
|
|
|
+ if (down_write_killable(&oldmm->mmap_sem)) {
|
|
|
+ retval = -EINTR;
|
|
|
+ goto fail_uprobe_end;
|
|
|
+ }
|
|
|
flush_cache_dup_mm(oldmm);
|
|
|
uprobe_dup_mmap(oldmm, mm);
|
|
|
/*
|
|
@@ -526,6 +529,7 @@ out:
|
|
|
up_write(&mm->mmap_sem);
|
|
|
flush_tlb_mm(oldmm);
|
|
|
up_write(&oldmm->mmap_sem);
|
|
|
+fail_uprobe_end:
|
|
|
uprobe_end_dup_mmap();
|
|
|
return retval;
|
|
|
fail_nomem_anon_vma_fork:
|