hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/mm/huge_memory.c
....@@ -1994,7 +1994,7 @@
19941994 {
19951995 struct mm_struct *mm = vma->vm_mm;
19961996 pgtable_t pgtable;
1997
- pmd_t _pmd;
1997
+ pmd_t _pmd, old_pmd;
19981998 int i;
19991999
20002000 /*
....@@ -2005,7 +2005,7 @@
20052005 *
20062006 * See Documentation/vm/mmu_notifier.rst
20072007 */
2008
- pmdp_huge_clear_flush(vma, haddr, pmd);
2008
+ old_pmd = pmdp_huge_clear_flush(vma, haddr, pmd);
20092009
20102010 pgtable = pgtable_trans_huge_withdraw(mm, pmd);
20112011 pmd_populate(mm, &_pmd, pgtable);
....@@ -2014,6 +2014,8 @@
20142014 pte_t *pte, entry;
20152015 entry = pfn_pte(my_zero_pfn(haddr), vma->vm_page_prot);
20162016 entry = pte_mkspecial(entry);
2017
+ if (pmd_uffd_wp(old_pmd))
2018
+ entry = pte_mkuffd_wp(entry);
20172019 pte = pte_offset_map(&_pmd, haddr);
20182020 VM_BUG_ON(!pte_none(*pte));
20192021 set_pte_at(mm, haddr, pte, entry);
....@@ -2816,6 +2818,9 @@
28162818 if (PageSwapCache(page))
28172819 return;
28182820
2821
+ if (!list_empty(page_deferred_list(page)))
2822
+ return;
2823
+
28192824 spin_lock_irqsave(&ds_queue->split_queue_lock, flags);
28202825 if (list_empty(page_deferred_list(page))) {
28212826 count_vm_event(THP_DEFERRED_SPLIT_PAGE);