|
@@ -2987,10 +2987,18 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
|
|
|
count_vm_event(THP_SPLIT_PMD);
|
|
count_vm_event(THP_SPLIT_PMD);
|
|
|
|
|
|
- if (vma_is_dax(vma)) {
|
|
|
|
- pmd_t _pmd = pmdp_huge_clear_flush_notify(vma, haddr, pmd);
|
|
|
|
|
|
+ if (!vma_is_anonymous(vma)) {
|
|
|
|
+ _pmd = pmdp_huge_clear_flush_notify(vma, haddr, pmd);
|
|
if (is_huge_zero_pmd(_pmd))
|
|
if (is_huge_zero_pmd(_pmd))
|
|
put_huge_zero_page();
|
|
put_huge_zero_page();
|
|
|
|
+ if (vma_is_dax(vma))
|
|
|
|
+ return;
|
|
|
|
+ page = pmd_page(_pmd);
|
|
|
|
+ if (!PageReferenced(page) && pmd_young(_pmd))
|
|
|
|
+ SetPageReferenced(page);
|
|
|
|
+ page_remove_rmap(page, true);
|
|
|
|
+ put_page(page);
|
|
|
|
+ add_mm_counter(mm, MM_FILEPAGES, -HPAGE_PMD_NR);
|
|
return;
|
|
return;
|
|
} else if (is_huge_zero_pmd(*pmd)) {
|
|
} else if (is_huge_zero_pmd(*pmd)) {
|
|
return __split_huge_zero_page_pmd(vma, haddr, pmd);
|
|
return __split_huge_zero_page_pmd(vma, haddr, pmd);
|