diff options
-rw-r--r-- | mm/memory.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/mm/memory.c b/mm/memory.c index 706c4c4a2b8e..47fe250307c7 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -3536,10 +3536,13 @@ static vm_fault_t do_shared_fault(struct vm_fault *vmf) | |||
3536 | * but allow concurrent faults). | 3536 | * but allow concurrent faults). |
3537 | * The mmap_sem may have been released depending on flags and our | 3537 | * The mmap_sem may have been released depending on flags and our |
3538 | * return value. See filemap_fault() and __lock_page_or_retry(). | 3538 | * return value. See filemap_fault() and __lock_page_or_retry(). |
3539 | * If mmap_sem is released, vma may become invalid (for example | ||
3540 | * by other thread calling munmap()). | ||
3539 | */ | 3541 | */ |
3540 | static vm_fault_t do_fault(struct vm_fault *vmf) | 3542 | static vm_fault_t do_fault(struct vm_fault *vmf) |
3541 | { | 3543 | { |
3542 | struct vm_area_struct *vma = vmf->vma; | 3544 | struct vm_area_struct *vma = vmf->vma; |
3545 | struct mm_struct *vm_mm = vma->vm_mm; | ||
3543 | vm_fault_t ret; | 3546 | vm_fault_t ret; |
3544 | 3547 | ||
3545 | /* | 3548 | /* |
@@ -3580,7 +3583,7 @@ static vm_fault_t do_fault(struct vm_fault *vmf) | |||
3580 | 3583 | ||
3581 | /* preallocated pagetable is unused: free it */ | 3584 | /* preallocated pagetable is unused: free it */ |
3582 | if (vmf->prealloc_pte) { | 3585 | if (vmf->prealloc_pte) { |
3583 | pte_free(vma->vm_mm, vmf->prealloc_pte); | 3586 | pte_free(vm_mm, vmf->prealloc_pte); |
3584 | vmf->prealloc_pte = NULL; | 3587 | vmf->prealloc_pte = NULL; |
3585 | } | 3588 | } |
3586 | return ret; | 3589 | return ret; |