Re: [PATCH 19/19] perf: Make perf_pmu_unregister() useable

From: Peter Zijlstra
Date: Tue Dec 17 2024 - 04:12:38 EST




Oh sorry, I seem to have missed this email :/

On Mon, Nov 25, 2024 at 09:40:28AM +0530, Ravi Bangoria wrote:
> Hi Peter,
>
> > @@ -6507,6 +6540,7 @@ static void perf_mmap_close(struct vm_ar
> > unsigned long size = perf_data_size(rb);
> > bool detach_rest = false;
> >
> > + /* FIXIES vs perf_pmu_unregister() */
> > if (event->pmu->event_unmapped)
> > event->pmu->event_unmapped(event, vma->vm_mm);
>
> I assume you are already aware of the race between __pmu_detach_event()
> and perf_mmap_close() since you have put that comment.

That comment was mostly about how we can't fix up the whole
->event_unmapped() thing and have to abort pmu_unregister for it.

> In any case, below sequence of operations triggers a splat when
> perf_mmap_close() tries to access event->rb, event->pmu etc. which
> were already freed by __pmu_detach_event().
>
> Sequence:
>
> Kernel Userspace
> ------ ---------
> perf_pmu_register()
> fd = perf_event_open()
> p = mmap(fd)
> perf_pmu_unregister()
> munmap(p)
> close(fd)

Right, let me go have a look. Thanks!