Skip to content

Commit

Permalink
perfcounters: release CPU context when exiting task counters
Browse files Browse the repository at this point in the history
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: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Ingo Molnar committed Dec 14, 2008
1 parent 029af8c commit 0cc0c02
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions kernel/perf_counter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -1539,4 +1550,3 @@ static int __init perf_counter_sysfs_init(void)
&perfclass_attr_group);
}
device_initcall(perf_counter_sysfs_init);

0 comments on commit 0cc0c02

Please sign in to comment.