diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/mm/memory.c b/mm/memory.c index 890095f5f36d..b273cc12b15d 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -810,8 +810,12 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, | |||
810 | */ | 810 | */ |
811 | if (unlikely(details)) | 811 | if (unlikely(details)) |
812 | continue; | 812 | continue; |
813 | if (!pte_file(ptent)) | 813 | if (pte_file(ptent)) { |
814 | free_swap_and_cache(pte_to_swp_entry(ptent)); | 814 | if (unlikely(!(vma->vm_flags & VM_NONLINEAR))) |
815 | print_bad_pte(vma, addr, ptent, NULL); | ||
816 | } else if | ||
817 | (unlikely(!free_swap_and_cache(pte_to_swp_entry(ptent)))) | ||
818 | print_bad_pte(vma, addr, ptent, NULL); | ||
815 | pte_clear_not_present_full(mm, addr, pte, tlb->fullmm); | 819 | pte_clear_not_present_full(mm, addr, pte, tlb->fullmm); |
816 | } while (pte++, addr += PAGE_SIZE, (addr != end && *zap_work > 0)); | 820 | } while (pte++, addr += PAGE_SIZE, (addr != end && *zap_work > 0)); |
817 | 821 | ||
@@ -2707,8 +2711,7 @@ static int do_nonlinear_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2707 | if (!pte_unmap_same(mm, pmd, page_table, orig_pte)) | 2711 | if (!pte_unmap_same(mm, pmd, page_table, orig_pte)) |
2708 | return 0; | 2712 | return 0; |
2709 | 2713 | ||
2710 | if (unlikely(!(vma->vm_flags & VM_NONLINEAR) || | 2714 | if (unlikely(!(vma->vm_flags & VM_NONLINEAR))) { |
2711 | !(vma->vm_flags & VM_CAN_NONLINEAR))) { | ||
2712 | /* | 2715 | /* |
2713 | * Page table corrupted: show pte and kill process. | 2716 | * Page table corrupted: show pte and kill process. |
2714 | */ | 2717 | */ |