diff options
author | Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | 2012-12-12 16:50:50 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-12 20:38:31 -0500 |
commit | 479f0abbfd253d1117a35c1df12755d27a2a0705 (patch) | |
tree | 28c90a3fb6ae4e6bc60f06b2b540fea8cbb155db /mm/huge_memory.c | |
parent | 4a6c1297268c917e9c50701906ba2f7e06812299 (diff) |
thp: zap_huge_pmd(): zap huge zero pmd
We don't have a mapped page to zap in huge zero page case. Let's just clear
pmd and remove it from tlb.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: "H. Peter Anvin" <hpa@linux.intel.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Acked-by: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 04eb489a6805..1ee34ddb46ad 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -1085,15 +1085,20 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, | |||
1085 | pmd_t orig_pmd; | 1085 | pmd_t orig_pmd; |
1086 | pgtable = pgtable_trans_huge_withdraw(tlb->mm); | 1086 | pgtable = pgtable_trans_huge_withdraw(tlb->mm); |
1087 | orig_pmd = pmdp_get_and_clear(tlb->mm, addr, pmd); | 1087 | orig_pmd = pmdp_get_and_clear(tlb->mm, addr, pmd); |
1088 | page = pmd_page(orig_pmd); | ||
1089 | tlb_remove_pmd_tlb_entry(tlb, pmd, addr); | 1088 | tlb_remove_pmd_tlb_entry(tlb, pmd, addr); |
1090 | page_remove_rmap(page); | 1089 | if (is_huge_zero_pmd(orig_pmd)) { |
1091 | VM_BUG_ON(page_mapcount(page) < 0); | 1090 | tlb->mm->nr_ptes--; |
1092 | add_mm_counter(tlb->mm, MM_ANONPAGES, -HPAGE_PMD_NR); | 1091 | spin_unlock(&tlb->mm->page_table_lock); |
1093 | VM_BUG_ON(!PageHead(page)); | 1092 | } else { |
1094 | tlb->mm->nr_ptes--; | 1093 | page = pmd_page(orig_pmd); |
1095 | spin_unlock(&tlb->mm->page_table_lock); | 1094 | page_remove_rmap(page); |
1096 | tlb_remove_page(tlb, page); | 1095 | VM_BUG_ON(page_mapcount(page) < 0); |
1096 | add_mm_counter(tlb->mm, MM_ANONPAGES, -HPAGE_PMD_NR); | ||
1097 | VM_BUG_ON(!PageHead(page)); | ||
1098 | tlb->mm->nr_ptes--; | ||
1099 | spin_unlock(&tlb->mm->page_table_lock); | ||
1100 | tlb_remove_page(tlb, page); | ||
1101 | } | ||
1097 | pte_free(tlb->mm, pgtable); | 1102 | pte_free(tlb->mm, pgtable); |
1098 | ret = 1; | 1103 | ret = 1; |
1099 | } | 1104 | } |