File tree 1 file changed +10
-5
lines changed
1 file changed +10
-5
lines changed Original file line number Diff line number Diff line change @@ -5079,7 +5079,11 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
5079
5079
bool is_cow = (vmf -> flags & FAULT_FLAG_WRITE ) &&
5080
5080
!(vma -> vm_flags & VM_SHARED );
5081
5081
int type , nr_pages ;
5082
- unsigned long addr = vmf -> address ;
5082
+ unsigned long addr ;
5083
+ bool needs_fallback = false;
5084
+
5085
+ fallback :
5086
+ addr = vmf -> address ;
5083
5087
5084
5088
/* Did we COW the page? */
5085
5089
if (is_cow )
@@ -5118,7 +5122,8 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
5118
5122
* approach also applies to non-anonymous-shmem faults to avoid
5119
5123
* inflating the RSS of the process.
5120
5124
*/
5121
- if (!vma_is_anon_shmem (vma ) || unlikely (userfaultfd_armed (vma ))) {
5125
+ if (!vma_is_anon_shmem (vma ) || unlikely (userfaultfd_armed (vma )) ||
5126
+ unlikely (needs_fallback )) {
5122
5127
nr_pages = 1 ;
5123
5128
} else if (nr_pages > 1 ) {
5124
5129
pgoff_t idx = folio_page_idx (folio , page );
@@ -5154,9 +5159,9 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
5154
5159
ret = VM_FAULT_NOPAGE ;
5155
5160
goto unlock ;
5156
5161
} else if (nr_pages > 1 && !pte_range_none (vmf -> pte , nr_pages )) {
5157
- update_mmu_tlb_range ( vma , addr , vmf -> pte , nr_pages ) ;
5158
- ret = VM_FAULT_NOPAGE ;
5159
- goto unlock ;
5162
+ needs_fallback = true ;
5163
+ pte_unmap_unlock ( vmf -> pte , vmf -> ptl ) ;
5164
+ goto fallback ;
5160
5165
}
5161
5166
5162
5167
folio_ref_add (folio , nr_pages - 1 );
You can’t perform that action at this time.
0 commit comments