diff --git a/kernel/events/core.c b/kernel/events/core.c index 277aa553841e6722c1b9f81c8e4feed27e8c21b1..c07e3b232ac7fd5b48c237a3e328ea26ae60b145 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5728,7 +5728,15 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) */ user_lock_limit *= num_online_cpus(); - user_locked = atomic_long_read(&user->locked_vm) + user_extra; + user_locked = atomic_long_read(&user->locked_vm); + + /* + * sysctl_perf_event_mlock may have changed, so that + * user->locked_vm > user_lock_limit + */ + if (user_locked > user_lock_limit) + user_locked = user_lock_limit; + user_locked += user_extra; if (user_locked > user_lock_limit) extra = user_locked - user_lock_limit;