Re: [PATCH v2 24/24] perf: Make perf_pmu_unregister() useable
From: Ravi Bangoria
Date: Mon Feb 10 2025 - 01:39:58 EST
Hi Peter,
> @@ -1737,7 +1742,7 @@ static inline bool needs_branch_stack(st
>
> static inline bool has_aux(struct perf_event *event)
> {
> - return event->pmu->setup_aux;
> + return event->pmu && event->pmu->setup_aux;
> }
this ...
> @@ -6412,7 +6444,7 @@ static void perf_mmap_open(struct vm_are
> if (vma->vm_pgoff)
> atomic_inc(&event->rb->aux_mmap_count);
>
> - if (event->pmu->event_mapped)
> + if (event->pmu && event->pmu->event_mapped)
> event->pmu->event_mapped(event, vma->vm_mm);
> }
>
> @@ -6435,7 +6467,8 @@ static void perf_mmap_close(struct vm_ar
> unsigned long size = perf_data_size(rb);
> bool detach_rest = false;
>
> - if (event->pmu->event_unmapped)
> + /* FIXIES vs perf_pmu_unregister() */
> + if (event->pmu && event->pmu->event_unmapped)
> event->pmu->event_unmapped(event, vma->vm_mm);
these two ...
> @@ -6837,7 +6880,7 @@ static int perf_mmap(struct file *file,
> if (!ret)
> ret = map_range(rb, vma);
>
> - if (!ret && event->pmu->event_mapped)
> + if (!ret && event->pmu && event->pmu->event_mapped)
> event->pmu->event_mapped(event, vma->vm_mm);
... and this one.
There is no serialization at all these places. i.e. event->pmu can become
NULL in between two checks.
CPU0: event->pmu = NULL
|
V
CPU1: if (event->pmu && event->pmu->blahblah())
Thanks,
Ravi