File tree Expand file tree Collapse file tree 2 files changed +25
-0
lines changed Expand file tree Collapse file tree 2 files changed +25
-0
lines changed Original file line number Diff line number Diff line change @@ -120,6 +120,7 @@ config S390
120
120
select ARCH_SUPPORTS_DEBUG_PAGEALLOC
121
121
select ARCH_SUPPORTS_HUGETLBFS
122
122
select ARCH_SUPPORTS_NUMA_BALANCING
123
+ select ARCH_SUPPORTS_PER_VMA_LOCK
123
124
select ARCH_USE_BUILTIN_BSWAP
124
125
select ARCH_USE_CMPXCHG_LOCKREF
125
126
select ARCH_WANTS_DYNAMIC_TASK_STRUCT
Original file line number Diff line number Diff line change @@ -407,6 +407,30 @@ static inline vm_fault_t do_exception(struct pt_regs *regs, int access)
407
407
access = VM_WRITE ;
408
408
if (access == VM_WRITE )
409
409
flags |= FAULT_FLAG_WRITE ;
410
+ #ifdef CONFIG_PER_VMA_LOCK
411
+ if (!(flags & FAULT_FLAG_USER ))
412
+ goto lock_mmap ;
413
+ vma = lock_vma_under_rcu (mm , address );
414
+ if (!vma )
415
+ goto lock_mmap ;
416
+ if (!(vma -> vm_flags & access )) {
417
+ vma_end_read (vma );
418
+ goto lock_mmap ;
419
+ }
420
+ fault = handle_mm_fault (vma , address , flags | FAULT_FLAG_VMA_LOCK , regs );
421
+ vma_end_read (vma );
422
+ if (!(fault & VM_FAULT_RETRY )) {
423
+ count_vm_vma_lock_event (VMA_LOCK_SUCCESS );
424
+ goto out ;
425
+ }
426
+ count_vm_vma_lock_event (VMA_LOCK_RETRY );
427
+ /* Quick path to respond to signals */
428
+ if (fault_signal_pending (fault , regs )) {
429
+ fault = VM_FAULT_SIGNAL ;
430
+ goto out ;
431
+ }
432
+ lock_mmap :
433
+ #endif /* CONFIG_PER_VMA_LOCK */
410
434
mmap_read_lock (mm );
411
435
412
436
gmap = NULL ;
You can’t perform that action at this time.
0 commit comments