| From 003461559ef7a9bd0239bae35a22ad8924d6e9ad Mon Sep 17 00:00:00 2001 |
| From: Song Liu <songliubraving@fb.com> |
| Date: Thu, 23 Jan 2020 10:11:46 -0800 |
| Subject: perf/core: Fix mlock accounting in perf_mmap() |
| |
| From: Song Liu <songliubraving@fb.com> |
| |
| commit 003461559ef7a9bd0239bae35a22ad8924d6e9ad upstream. |
| |
| Decreasing sysctl_perf_event_mlock between two consecutive perf_mmap()s of |
| a perf ring buffer may lead to an integer underflow in locked memory |
| accounting. This may lead to the undesired behaviors, such as failures in |
| BPF map creation. |
| |
| Address this by adjusting the accounting logic to take into account the |
| possibility that the amount of already locked memory may exceed the |
| current limit. |
| |
| Fixes: c4b75479741c ("perf/core: Make the mlock accounting simple again") |
| Suggested-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Signed-off-by: Song Liu <songliubraving@fb.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Cc: <stable@vger.kernel.org> |
| Acked-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Link: https://lkml.kernel.org/r/20200123181146.2238074-1-songliubraving@fb.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/events/core.c | 10 +++++++++- |
| 1 file changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/events/core.c |
| +++ b/kernel/events/core.c |
| @@ -5709,7 +5709,15 @@ accounting: |
| */ |
| 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; |