diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index e187454d82f6..e62ddb8f24b6 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) | |
@@ -1847,7 +1852,6 @@ static void collapse_huge_page(struct mm_struct *mm, | |||
1847 | set_pmd_at(mm, address, pmd, _pmd); | 1852 | set_pmd_at(mm, address, pmd, _pmd); |
1848 | spin_unlock(&mm->page_table_lock); | 1853 | spin_unlock(&mm->page_table_lock); |
1849 | anon_vma_unlock(vma->anon_vma); | 1854 | anon_vma_unlock(vma->anon_vma); |
1850 | mem_cgroup_uncharge_page(new_page); | ||
1851 | goto out; | 1855 | goto out; |
1852 | } | 1856 | } |
1853 | 1857 | ||
@@ -1893,6 +1897,7 @@ out_up_write: | |||
1893 | return; | 1897 | return; |
1894 | 1898 | ||
1895 | out: | 1899 | out: |
1900 | mem_cgroup_uncharge_page(new_page); | ||
1896 | #ifdef CONFIG_NUMA | 1901 | #ifdef CONFIG_NUMA |
1897 | put_page(new_page); | 1902 | put_page(new_page); |
1898 | #endif | 1903 | #endif |