aboutsummaryrefslogtreecommitdiffstats
path: root/mm/huge_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r--mm/huge_memory.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 004c9c2aac78..b6c1ce3c53b5 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1162,7 +1162,12 @@ static void __split_huge_page_refcount(struct page *page)
1162 /* after clearing PageTail the gup refcount can be released */ 1162 /* after clearing PageTail the gup refcount can be released */
1163 smp_mb(); 1163 smp_mb();
1164 1164
1165 page_tail->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; 1165 /*
1166 * retain hwpoison flag of the poisoned tail page:
1167 * fix for the unsuitable process killed on Guest Machine(KVM)
1168 * by the memory-failure.
1169 */
1170 page_tail->flags &= ~PAGE_FLAGS_CHECK_AT_PREP | __PG_HWPOISON;
1166 page_tail->flags |= (page->flags & 1171 page_tail->flags |= (page->flags &
1167 ((1L << PG_referenced) | 1172 ((1L << PG_referenced) |
1168 (1L << PG_swapbacked) | 1173 (1L << PG_swapbacked) |
@@ -1203,6 +1208,8 @@ static void __split_huge_page_refcount(struct page *page)
1203 BUG_ON(!PageDirty(page_tail)); 1208 BUG_ON(!PageDirty(page_tail));
1204 BUG_ON(!PageSwapBacked(page_tail)); 1209 BUG_ON(!PageSwapBacked(page_tail));
1205 1210
1211 mem_cgroup_split_huge_fixup(page, page_tail);
1212
1206 lru_add_page_tail(zone, page, page_tail); 1213 lru_add_page_tail(zone, page, page_tail);
1207 } 1214 }
1208 1215
@@ -1837,9 +1844,9 @@ static void collapse_huge_page(struct mm_struct *mm,
1837 spin_lock(ptl); 1844 spin_lock(ptl);
1838 isolated = __collapse_huge_page_isolate(vma, address, pte); 1845 isolated = __collapse_huge_page_isolate(vma, address, pte);
1839 spin_unlock(ptl); 1846 spin_unlock(ptl);
1840 pte_unmap(pte);
1841 1847
1842 if (unlikely(!isolated)) { 1848 if (unlikely(!isolated)) {
1849 pte_unmap(pte);
1843 spin_lock(&mm->page_table_lock); 1850 spin_lock(&mm->page_table_lock);
1844 BUG_ON(!pmd_none(*pmd)); 1851 BUG_ON(!pmd_none(*pmd));
1845 set_pmd_at(mm, address, pmd, _pmd); 1852 set_pmd_at(mm, address, pmd, _pmd);
@@ -1856,6 +1863,7 @@ static void collapse_huge_page(struct mm_struct *mm,
1856 anon_vma_unlock(vma->anon_vma); 1863 anon_vma_unlock(vma->anon_vma);
1857 1864
1858 __collapse_huge_page_copy(pte, new_page, vma, address, ptl); 1865 __collapse_huge_page_copy(pte, new_page, vma, address, ptl);
1866 pte_unmap(pte);
1859 __SetPageUptodate(new_page); 1867 __SetPageUptodate(new_page);
1860 pgtable = pmd_pgtable(_pmd); 1868 pgtable = pmd_pgtable(_pmd);
1861 VM_BUG_ON(page_count(pgtable) != 1); 1869 VM_BUG_ON(page_count(pgtable) != 1);