Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0cc0c027 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

perfcounters: release CPU context when exiting task counters



If counters are exiting via do_exit() not via filp close, then
the CPU context needs to be released - otherwise future percpu
counter creations might fail.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 029af8c7
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -1273,8 +1273,19 @@ __perf_counter_exit_task(struct task_struct *child,
	local_irq_disable();
	perf_flags = hw_perf_save_disable();

	if (child_counter->state == PERF_COUNTER_STATE_ACTIVE)
	if (child_counter->state == PERF_COUNTER_STATE_ACTIVE) {
		struct perf_cpu_context *cpuctx;

		cpuctx = &__get_cpu_var(perf_cpu_context);

		child_counter->hw_ops->hw_perf_counter_disable(child_counter);
		child_counter->state = PERF_COUNTER_STATE_INACTIVE;
		child_counter->oncpu = -1;

		cpuctx->active_oncpu--;
		child_ctx->nr_active--;
	}

	list_del_init(&child_counter->list_entry);

	hw_perf_restore(perf_flags);
@@ -1539,4 +1550,3 @@ static int __init perf_counter_sysfs_init(void)
				  &perfclass_attr_group);
}
device_initcall(perf_counter_sysfs_init);