diff --git a/kernel/events/core.c b/kernel/events/core.c index 01cc0f41b411..9bdc322273fd 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -6628,7 +6629,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) vma_size = vma->vm_end - vma->vm_start; if (vma->vm_pgoff == 0) { - nr_pages = (vma_size / PAGE_SIZE) - 1; + nr_pages = (vma_size / PAGE_SIZE) - (__PAGE_SIZE / PAGE_SIZE); } else { /* * AUX area mapping: if rb->aux_nr_pages != 0, it's already @@ -6699,7 +6700,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) if (nr_pages != 0 && !is_power_of_2(nr_pages)) return -EINVAL; - if (vma_size != PAGE_SIZE * (1 + nr_pages)) + if (vma_size != PAGE_SIZE * ((__PAGE_SIZE / PAGE_SIZE) + nr_pages)) return -EINVAL; WARN_ON_ONCE(event->ctx->parent_ctx); diff --git a/mm/page_size_compat.c b/mm/page_size_compat.c index 3b2b9f52a42e..716f59f25518 100644 --- a/mm/page_size_compat.c +++ b/mm/page_size_compat.c @@ -13,6 +13,7 @@ #include #include #include +#include #define MIN_PAGE_SHIFT_COMPAT (PAGE_SHIFT + 1) #define MAX_PAGE_SHIFT_COMPAT 16 /* Max of 64KB */ @@ -315,3 +316,15 @@ free_magic: return error; } + +static int __init init_sysctl_perf_event_mlock(void) +{ + if (!static_branch_unlikely(&page_shift_compat_enabled)) + return 0; + + /* Minimum for 512 kiB + 1 user control page */ + sysctl_perf_event_mlock = 512 + (__PAGE_SIZE / 1024); /* 'free' kiB per user */ + + return 0; +} +core_initcall(init_sysctl_perf_event_mlock);