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; |
