diff options
-rw-r--r-- | kernel/fork.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index e67d7b773348..47887bba944f 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -414,7 +414,10 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
414 | unsigned long charge; | 414 | unsigned long charge; |
415 | 415 | ||
416 | uprobe_start_dup_mmap(); | 416 | uprobe_start_dup_mmap(); |
417 | down_write(&oldmm->mmap_sem); | 417 | if (down_write_killable(&oldmm->mmap_sem)) { |
418 | retval = -EINTR; | ||
419 | goto fail_uprobe_end; | ||
420 | } | ||
418 | flush_cache_dup_mm(oldmm); | 421 | flush_cache_dup_mm(oldmm); |
419 | uprobe_dup_mmap(oldmm, mm); | 422 | uprobe_dup_mmap(oldmm, mm); |
420 | /* | 423 | /* |
@@ -526,6 +529,7 @@ out: | |||
526 | up_write(&mm->mmap_sem); | 529 | up_write(&mm->mmap_sem); |
527 | flush_tlb_mm(oldmm); | 530 | flush_tlb_mm(oldmm); |
528 | up_write(&oldmm->mmap_sem); | 531 | up_write(&oldmm->mmap_sem); |
532 | fail_uprobe_end: | ||
529 | uprobe_end_dup_mmap(); | 533 | uprobe_end_dup_mmap(); |
530 | return retval; | 534 | return retval; |
531 | fail_nomem_anon_vma_fork: | 535 | fail_nomem_anon_vma_fork: |