Loading kernel/events/core.c +17 −4 Original line number Diff line number Diff line Loading @@ -4486,7 +4486,7 @@ static DEFINE_SPINLOCK(zombie_list_lock); * object, it will not preserve its functionality. Once the last 'user' * gives up the object, we'll destroy the thing. */ int perf_event_release_kernel(struct perf_event *event) static int __perf_event_release_kernel(struct perf_event *event) { struct perf_event_context *ctx = event->ctx; struct perf_event *child, *tmp; Loading @@ -4500,8 +4500,7 @@ int perf_event_release_kernel(struct perf_event *event) if (event->state == PERF_EVENT_STATE_ZOMBIE) return 0; if (event->cpu != -1 && !cpu_online(event->cpu) && event->state == PERF_EVENT_STATE_ACTIVE) { if (event->cpu != -1 && per_cpu(is_hotplugging, event->cpu)) { event->state = PERF_EVENT_STATE_ZOMBIE; spin_lock(&zombie_list_lock); Loading Loading @@ -4620,6 +4619,17 @@ int perf_event_release_kernel(struct perf_event *event) put_event(event); /* Must be the 'last' reference */ return 0; } int perf_event_release_kernel(struct perf_event *event) { int ret; mutex_lock(&pmus_lock); ret = __perf_event_release_kernel(event); mutex_unlock(&pmus_lock); return ret; } EXPORT_SYMBOL_GPL(perf_event_release_kernel); /* Loading Loading @@ -11556,7 +11566,7 @@ static void perf_event_zombie_cleanup(unsigned int cpu) * PMU expects it to be in an active state */ event->state = PERF_EVENT_STATE_ACTIVE; perf_event_release_kernel(event); __perf_event_release_kernel(event); spin_lock(&zombie_list_lock); } Loading @@ -11571,6 +11581,7 @@ int perf_event_start_swevents(unsigned int cpu) struct perf_event *event; int idx; mutex_lock(&pmus_lock); perf_event_zombie_cleanup(cpu); perf_deferred_install_in_context(cpu); Loading @@ -11586,6 +11597,8 @@ int perf_event_start_swevents(unsigned int cpu) } srcu_read_unlock(&pmus_srcu, idx); per_cpu(is_hotplugging, cpu) = false; mutex_unlock(&pmus_lock); return 0; } Loading Loading
kernel/events/core.c +17 −4 Original line number Diff line number Diff line Loading @@ -4486,7 +4486,7 @@ static DEFINE_SPINLOCK(zombie_list_lock); * object, it will not preserve its functionality. Once the last 'user' * gives up the object, we'll destroy the thing. */ int perf_event_release_kernel(struct perf_event *event) static int __perf_event_release_kernel(struct perf_event *event) { struct perf_event_context *ctx = event->ctx; struct perf_event *child, *tmp; Loading @@ -4500,8 +4500,7 @@ int perf_event_release_kernel(struct perf_event *event) if (event->state == PERF_EVENT_STATE_ZOMBIE) return 0; if (event->cpu != -1 && !cpu_online(event->cpu) && event->state == PERF_EVENT_STATE_ACTIVE) { if (event->cpu != -1 && per_cpu(is_hotplugging, event->cpu)) { event->state = PERF_EVENT_STATE_ZOMBIE; spin_lock(&zombie_list_lock); Loading Loading @@ -4620,6 +4619,17 @@ int perf_event_release_kernel(struct perf_event *event) put_event(event); /* Must be the 'last' reference */ return 0; } int perf_event_release_kernel(struct perf_event *event) { int ret; mutex_lock(&pmus_lock); ret = __perf_event_release_kernel(event); mutex_unlock(&pmus_lock); return ret; } EXPORT_SYMBOL_GPL(perf_event_release_kernel); /* Loading Loading @@ -11556,7 +11566,7 @@ static void perf_event_zombie_cleanup(unsigned int cpu) * PMU expects it to be in an active state */ event->state = PERF_EVENT_STATE_ACTIVE; perf_event_release_kernel(event); __perf_event_release_kernel(event); spin_lock(&zombie_list_lock); } Loading @@ -11571,6 +11581,7 @@ int perf_event_start_swevents(unsigned int cpu) struct perf_event *event; int idx; mutex_lock(&pmus_lock); perf_event_zombie_cleanup(cpu); perf_deferred_install_in_context(cpu); Loading @@ -11586,6 +11597,8 @@ int perf_event_start_swevents(unsigned int cpu) } srcu_read_unlock(&pmus_srcu, idx); per_cpu(is_hotplugging, cpu) = false; mutex_unlock(&pmus_lock); return 0; } Loading