@@ -3043,32 +3043,31 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
3043
3043
const bool unshare = vmf -> flags & FAULT_FLAG_UNSHARE ;
3044
3044
struct vm_area_struct * vma = vmf -> vma ;
3045
3045
struct mm_struct * mm = vma -> vm_mm ;
3046
- struct page * old_page = vmf -> page ;
3047
- struct page * new_page = NULL ;
3046
+ struct folio * old_folio = NULL ;
3047
+ struct folio * new_folio = NULL ;
3048
3048
pte_t entry ;
3049
3049
int page_copied = 0 ;
3050
3050
struct mmu_notifier_range range ;
3051
3051
int ret ;
3052
3052
3053
3053
delayacct_wpcopy_start ();
3054
3054
3055
+ if (vmf -> page )
3056
+ old_folio = page_folio (vmf -> page );
3055
3057
if (unlikely (anon_vma_prepare (vma )))
3056
3058
goto oom ;
3057
3059
3058
3060
if (is_zero_pfn (pte_pfn (vmf -> orig_pte ))) {
3059
- struct folio * new_folio ;
3060
-
3061
3061
new_folio = vma_alloc_zeroed_movable_folio (vma , vmf -> address );
3062
3062
if (!new_folio )
3063
3063
goto oom ;
3064
- new_page = & new_folio -> page ;
3065
3064
} else {
3066
- new_page = alloc_page_vma (GFP_HIGHUSER_MOVABLE , vma ,
3067
- vmf -> address );
3068
- if (!new_page )
3065
+ new_folio = vma_alloc_folio (GFP_HIGHUSER_MOVABLE , 0 , vma ,
3066
+ vmf -> address , false );
3067
+ if (!new_folio )
3069
3068
goto oom ;
3070
3069
3071
- ret = __wp_page_copy_user (new_page , old_page , vmf );
3070
+ ret = __wp_page_copy_user (& new_folio -> page , vmf -> page , vmf );
3072
3071
if (ret ) {
3073
3072
/*
3074
3073
* COW failed, if the fault was solved by other,
@@ -3077,21 +3076,21 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
3077
3076
* from the second attempt.
3078
3077
* The -EHWPOISON case will not be retried.
3079
3078
*/
3080
- put_page ( new_page );
3081
- if (old_page )
3082
- put_page ( old_page );
3079
+ folio_put ( new_folio );
3080
+ if (old_folio )
3081
+ folio_put ( old_folio );
3083
3082
3084
3083
delayacct_wpcopy_end ();
3085
3084
return ret == - EHWPOISON ? VM_FAULT_HWPOISON : 0 ;
3086
3085
}
3087
- kmsan_copy_page_meta (new_page , old_page );
3086
+ kmsan_copy_page_meta (& new_folio -> page , vmf -> page );
3088
3087
}
3089
3088
3090
- if (mem_cgroup_charge (page_folio ( new_page ) , mm , GFP_KERNEL ))
3089
+ if (mem_cgroup_charge (new_folio , mm , GFP_KERNEL ))
3091
3090
goto oom_free_new ;
3092
- cgroup_throttle_swaprate (new_page , GFP_KERNEL );
3091
+ cgroup_throttle_swaprate (& new_folio -> page , GFP_KERNEL );
3093
3092
3094
- __SetPageUptodate ( new_page );
3093
+ __folio_mark_uptodate ( new_folio );
3095
3094
3096
3095
mmu_notifier_range_init (& range , MMU_NOTIFY_CLEAR , 0 , mm ,
3097
3096
vmf -> address & PAGE_MASK ,
@@ -3103,16 +3102,16 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
3103
3102
*/
3104
3103
vmf -> pte = pte_offset_map_lock (mm , vmf -> pmd , vmf -> address , & vmf -> ptl );
3105
3104
if (likely (pte_same (* vmf -> pte , vmf -> orig_pte ))) {
3106
- if (old_page ) {
3107
- if (!PageAnon ( old_page )) {
3108
- dec_mm_counter (mm , mm_counter_file (old_page ));
3105
+ if (old_folio ) {
3106
+ if (!folio_test_anon ( old_folio )) {
3107
+ dec_mm_counter (mm , mm_counter_file (& old_folio -> page ));
3109
3108
inc_mm_counter (mm , MM_ANONPAGES );
3110
3109
}
3111
3110
} else {
3112
3111
inc_mm_counter (mm , MM_ANONPAGES );
3113
3112
}
3114
3113
flush_cache_page (vma , vmf -> address , pte_pfn (vmf -> orig_pte ));
3115
- entry = mk_pte (new_page , vma -> vm_page_prot );
3114
+ entry = mk_pte (& new_folio -> page , vma -> vm_page_prot );
3116
3115
entry = pte_sw_mkyoung (entry );
3117
3116
if (unlikely (unshare )) {
3118
3117
if (pte_soft_dirty (vmf -> orig_pte ))
@@ -3131,8 +3130,8 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
3131
3130
* some TLBs while the old PTE remains in others.
3132
3131
*/
3133
3132
ptep_clear_flush_notify (vma , vmf -> address , vmf -> pte );
3134
- page_add_new_anon_rmap ( new_page , vma , vmf -> address );
3135
- lru_cache_add_inactive_or_unevictable ( new_page , vma );
3133
+ folio_add_new_anon_rmap ( new_folio , vma , vmf -> address );
3134
+ folio_add_lru_vma ( new_folio , vma );
3136
3135
/*
3137
3136
* We call the notify macro here because, when using secondary
3138
3137
* mmu page tables (such as kvm shadow page tables), we want the
@@ -3141,7 +3140,7 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
3141
3140
BUG_ON (unshare && pte_write (entry ));
3142
3141
set_pte_at_notify (mm , vmf -> address , vmf -> pte , entry );
3143
3142
update_mmu_cache (vma , vmf -> address , vmf -> pte );
3144
- if (old_page ) {
3143
+ if (old_folio ) {
3145
3144
/*
3146
3145
* Only after switching the pte to the new page may
3147
3146
* we remove the mapcount here. Otherwise another
@@ -3164,38 +3163,38 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
3164
3163
* mapcount is visible. So transitively, TLBs to
3165
3164
* old page will be flushed before it can be reused.
3166
3165
*/
3167
- page_remove_rmap (old_page , vma , false);
3166
+ page_remove_rmap (vmf -> page , vma , false);
3168
3167
}
3169
3168
3170
3169
/* Free the old page.. */
3171
- new_page = old_page ;
3170
+ new_folio = old_folio ;
3172
3171
page_copied = 1 ;
3173
3172
} else {
3174
3173
update_mmu_tlb (vma , vmf -> address , vmf -> pte );
3175
3174
}
3176
3175
3177
- if (new_page )
3178
- put_page ( new_page );
3176
+ if (new_folio )
3177
+ folio_put ( new_folio );
3179
3178
3180
3179
pte_unmap_unlock (vmf -> pte , vmf -> ptl );
3181
3180
/*
3182
3181
* No need to double call mmu_notifier->invalidate_range() callback as
3183
3182
* the above ptep_clear_flush_notify() did already call it.
3184
3183
*/
3185
3184
mmu_notifier_invalidate_range_only_end (& range );
3186
- if (old_page ) {
3185
+ if (old_folio ) {
3187
3186
if (page_copied )
3188
- free_swap_cache (old_page );
3189
- put_page ( old_page );
3187
+ free_swap_cache (& old_folio -> page );
3188
+ folio_put ( old_folio );
3190
3189
}
3191
3190
3192
3191
delayacct_wpcopy_end ();
3193
3192
return 0 ;
3194
3193
oom_free_new :
3195
- put_page ( new_page );
3194
+ folio_put ( new_folio );
3196
3195
oom :
3197
- if (old_page )
3198
- put_page ( old_page );
3196
+ if (old_folio )
3197
+ folio_put ( old_folio );
3199
3198
3200
3199
delayacct_wpcopy_end ();
3201
3200
return VM_FAULT_OOM ;
0 commit comments