diff --git a/kernel/events/core.c b/kernel/events/core.c index 4b9c5050ede26bd68390107a62ce79618dcd1836..d1ffd5fb9c6f84b948d84a8e7ba0b33430c45e43 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6042,11 +6042,21 @@ static void perf_mmap_close(struct vm_area_struct *vma) ring_buffer_put(rb); /* could be last */ } +static int perf_mmap_may_split(struct vm_area_struct *vma, unsigned long addr) +{ + /* + * Forbid splitting perf mappings to prevent refcount leaks due to + * the resulting non-matching offsets and sizes. See open()/close(). + */ + return -EINVAL; +} + static const struct vm_operations_struct perf_mmap_vmops = { .open = perf_mmap_open, .close = perf_mmap_close, /* non mergeable */ .fault = perf_mmap_fault, .page_mkwrite = perf_mmap_fault, + .split = perf_mmap_may_split, }; static int perf_mmap(struct file *file, struct vm_area_struct *vma)