| .. | .. |
|---|
| 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); |
|---|