File tree Expand file tree Collapse file tree 1 file changed +10
-5
lines changed Expand file tree Collapse file tree 1 file changed +10
-5
lines changed Original file line number Diff line number Diff line change @@ -5185,7 +5185,11 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
5185
5185
bool is_cow = (vmf -> flags & FAULT_FLAG_WRITE ) &&
5186
5186
!(vma -> vm_flags & VM_SHARED );
5187
5187
int type , nr_pages ;
5188
- unsigned long addr = vmf -> address ;
5188
+ unsigned long addr ;
5189
+ bool needs_fallback = false;
5190
+
5191
+ fallback :
5192
+ addr = vmf -> address ;
5189
5193
5190
5194
/* Did we COW the page? */
5191
5195
if (is_cow )
@@ -5224,7 +5228,8 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
5224
5228
* approach also applies to non-anonymous-shmem faults to avoid
5225
5229
* inflating the RSS of the process.
5226
5230
*/
5227
- if (!vma_is_anon_shmem (vma ) || unlikely (userfaultfd_armed (vma ))) {
5231
+ if (!vma_is_anon_shmem (vma ) || unlikely (userfaultfd_armed (vma )) ||
5232
+ unlikely (needs_fallback )) {
5228
5233
nr_pages = 1 ;
5229
5234
} else if (nr_pages > 1 ) {
5230
5235
pgoff_t idx = folio_page_idx (folio , page );
@@ -5260,9 +5265,9 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
5260
5265
ret = VM_FAULT_NOPAGE ;
5261
5266
goto unlock ;
5262
5267
} else if (nr_pages > 1 && !pte_range_none (vmf -> pte , nr_pages )) {
5263
- update_mmu_tlb_range ( vma , addr , vmf -> pte , nr_pages ) ;
5264
- ret = VM_FAULT_NOPAGE ;
5265
- goto unlock ;
5268
+ needs_fallback = true ;
5269
+ pte_unmap_unlock ( vmf -> pte , vmf -> ptl ) ;
5270
+ goto fallback ;
5266
5271
}
5267
5272
5268
5273
folio_ref_add (folio , nr_pages - 1 );
You can’t perform that action at this time.
0 commit comments