{
        struct page *swapcache;
        spinlock_t *ptl;
-       pte_t *pte;
+       pte_t *pte, new_pte;
        int ret = 1;
 
        swapcache = page;
                page_add_new_anon_rmap(page, vma, addr);
                lru_cache_add_inactive_or_unevictable(page, vma);
        }
-       set_pte_at(vma->vm_mm, addr, pte,
-                  pte_mkold(mk_pte(page, vma->vm_page_prot)));
+       new_pte = pte_mkold(mk_pte(page, vma->vm_page_prot));
+       if (pte_swp_soft_dirty(*pte))
+               new_pte = pte_mksoft_dirty(new_pte);
+       if (pte_swp_uffd_wp(*pte))
+               new_pte = pte_mkuffd_wp(new_pte);
+       set_pte_at(vma->vm_mm, addr, pte, new_pte);
        swap_free(entry);
 out:
        pte_unmap_unlock(pte, ptl);