@@ -1059,8 +1059,13 @@ static int move_present_pte(struct mm_struct *mm,
1059
1059
src_folio -> index = linear_page_index (dst_vma , dst_addr );
1060
1060
1061
1061
orig_dst_pte = mk_pte (& src_folio -> page , dst_vma -> vm_page_prot );
1062
- /* Follow mremap() behavior and treat the entry dirty after the move */
1063
- orig_dst_pte = pte_mkwrite (pte_mkdirty (orig_dst_pte ), dst_vma );
1062
+ /* Set soft dirty bit so userspace can notice the pte was moved */
1063
+ #ifdef CONFIG_MEM_SOFT_DIRTY
1064
+ orig_dst_pte = pte_mksoft_dirty (orig_dst_pte );
1065
+ #endif
1066
+ if (pte_dirty (orig_src_pte ))
1067
+ orig_dst_pte = pte_mkdirty (orig_dst_pte );
1068
+ orig_dst_pte = pte_mkwrite (orig_dst_pte , dst_vma );
1064
1069
1065
1070
set_pte_at (mm , dst_addr , dst_pte , orig_dst_pte );
1066
1071
out :
@@ -1094,6 +1099,9 @@ static int move_swap_pte(struct mm_struct *mm, struct vm_area_struct *dst_vma,
1094
1099
}
1095
1100
1096
1101
orig_src_pte = ptep_get_and_clear (mm , src_addr , src_pte );
1102
+ #ifdef CONFIG_MEM_SOFT_DIRTY
1103
+ orig_src_pte = pte_swp_mksoft_dirty (orig_src_pte );
1104
+ #endif
1097
1105
set_pte_at (mm , dst_addr , dst_pte , orig_src_pte );
1098
1106
double_pt_unlock (dst_ptl , src_ptl );
1099
1107
0 commit comments