@@ -1068,8 +1068,13 @@ static int move_present_pte(struct mm_struct *mm,
1068
1068
src_folio -> index = linear_page_index (dst_vma , dst_addr );
1069
1069
1070
1070
orig_dst_pte = mk_pte (& src_folio -> page , dst_vma -> vm_page_prot );
1071
- /* Follow mremap() behavior and treat the entry dirty after the move */
1072
- orig_dst_pte = pte_mkwrite (pte_mkdirty (orig_dst_pte ), dst_vma );
1071
+ /* Set soft dirty bit so userspace can notice the pte was moved */
1072
+ #ifdef CONFIG_MEM_SOFT_DIRTY
1073
+ orig_dst_pte = pte_mksoft_dirty (orig_dst_pte );
1074
+ #endif
1075
+ if (pte_dirty (orig_src_pte ))
1076
+ orig_dst_pte = pte_mkdirty (orig_dst_pte );
1077
+ orig_dst_pte = pte_mkwrite (orig_dst_pte , dst_vma );
1073
1078
1074
1079
set_pte_at (mm , dst_addr , dst_pte , orig_dst_pte );
1075
1080
out :
@@ -1104,6 +1109,9 @@ static int move_swap_pte(struct mm_struct *mm, struct vm_area_struct *dst_vma,
1104
1109
}
1105
1110
1106
1111
orig_src_pte = ptep_get_and_clear (mm , src_addr , src_pte );
1112
+ #ifdef CONFIG_MEM_SOFT_DIRTY
1113
+ orig_src_pte = pte_swp_mksoft_dirty (orig_src_pte );
1114
+ #endif
1107
1115
set_pte_at (mm , dst_addr , dst_pte , orig_src_pte );
1108
1116
double_pt_unlock (dst_ptl , src_ptl );
1109
1117
0 commit comments