diff options
| -rw-r--r-- | kernel/events/core.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 6bc21e202ae4..243bfc68d0fe 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -8955,6 +8955,14 @@ static struct perf_cpu_context __percpu *find_pmu_context(int ctxn) | |||
| 8955 | 8955 | ||
| 8956 | static void free_pmu_context(struct pmu *pmu) | 8956 | static void free_pmu_context(struct pmu *pmu) |
| 8957 | { | 8957 | { |
| 8958 | /* | ||
| 8959 | * Static contexts such as perf_sw_context have a global lifetime | ||
| 8960 | * and may be shared between different PMUs. Avoid freeing them | ||
| 8961 | * when a single PMU is going away. | ||
| 8962 | */ | ||
| 8963 | if (pmu->task_ctx_nr > perf_invalid_context) | ||
| 8964 | return; | ||
| 8965 | |||
| 8958 | mutex_lock(&pmus_lock); | 8966 | mutex_lock(&pmus_lock); |
| 8959 | free_percpu(pmu->pmu_cpu_context); | 8967 | free_percpu(pmu->pmu_cpu_context); |
| 8960 | mutex_unlock(&pmus_lock); | 8968 | mutex_unlock(&pmus_lock); |
