.. | .. |
---|
1994 | 1994 | { |
---|
1995 | 1995 | struct mm_struct *mm = vma->vm_mm; |
---|
1996 | 1996 | pgtable_t pgtable; |
---|
1997 | | - pmd_t _pmd; |
---|
| 1997 | + pmd_t _pmd, old_pmd; |
---|
1998 | 1998 | int i; |
---|
1999 | 1999 | |
---|
2000 | 2000 | /* |
---|
.. | .. |
---|
2005 | 2005 | * |
---|
2006 | 2006 | * See Documentation/vm/mmu_notifier.rst |
---|
2007 | 2007 | */ |
---|
2008 | | - pmdp_huge_clear_flush(vma, haddr, pmd); |
---|
| 2008 | + old_pmd = pmdp_huge_clear_flush(vma, haddr, pmd); |
---|
2009 | 2009 | |
---|
2010 | 2010 | pgtable = pgtable_trans_huge_withdraw(mm, pmd); |
---|
2011 | 2011 | pmd_populate(mm, &_pmd, pgtable); |
---|
.. | .. |
---|
2014 | 2014 | pte_t *pte, entry; |
---|
2015 | 2015 | entry = pfn_pte(my_zero_pfn(haddr), vma->vm_page_prot); |
---|
2016 | 2016 | entry = pte_mkspecial(entry); |
---|
| 2017 | + if (pmd_uffd_wp(old_pmd)) |
---|
| 2018 | + entry = pte_mkuffd_wp(entry); |
---|
2017 | 2019 | pte = pte_offset_map(&_pmd, haddr); |
---|
2018 | 2020 | VM_BUG_ON(!pte_none(*pte)); |
---|
2019 | 2021 | set_pte_at(mm, haddr, pte, entry); |
---|
.. | .. |
---|
2816 | 2818 | if (PageSwapCache(page)) |
---|
2817 | 2819 | return; |
---|
2818 | 2820 | |
---|
| 2821 | + if (!list_empty(page_deferred_list(page))) |
---|
| 2822 | + return; |
---|
| 2823 | + |
---|
2819 | 2824 | spin_lock_irqsave(&ds_queue->split_queue_lock, flags); |
---|
2820 | 2825 | if (list_empty(page_deferred_list(page))) { |
---|
2821 | 2826 | count_vm_event(THP_DEFERRED_SPLIT_PAGE); |
---|