Commit 71a851b4 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

perf_counter: Stop open coding unclone_ctx

Instead of open coding the unclone context thingy, put it in
a common function.
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 984b838c
...@@ -146,6 +146,14 @@ static void put_ctx(struct perf_counter_context *ctx) ...@@ -146,6 +146,14 @@ static void put_ctx(struct perf_counter_context *ctx)
} }
} }
static void unclone_ctx(struct perf_counter_context *ctx)
{
if (ctx->parent_ctx) {
put_ctx(ctx->parent_ctx);
ctx->parent_ctx = NULL;
}
}
/* /*
* Get the perf_counter_context for a task and lock it. * Get the perf_counter_context for a task and lock it.
* This has to cope with with the fact that until it is locked, * This has to cope with with the fact that until it is locked,
...@@ -1463,10 +1471,8 @@ static void perf_counter_enable_on_exec(struct task_struct *task) ...@@ -1463,10 +1471,8 @@ static void perf_counter_enable_on_exec(struct task_struct *task)
/* /*
* Unclone this context if we enabled any counter. * Unclone this context if we enabled any counter.
*/ */
if (enabled && ctx->parent_ctx) { if (enabled)
put_ctx(ctx->parent_ctx); unclone_ctx(ctx);
ctx->parent_ctx = NULL;
}
spin_unlock(&ctx->lock); spin_unlock(&ctx->lock);
...@@ -1526,7 +1532,6 @@ __perf_counter_init_context(struct perf_counter_context *ctx, ...@@ -1526,7 +1532,6 @@ __perf_counter_init_context(struct perf_counter_context *ctx,
static struct perf_counter_context *find_get_context(pid_t pid, int cpu) static struct perf_counter_context *find_get_context(pid_t pid, int cpu)
{ {
struct perf_counter_context *parent_ctx;
struct perf_counter_context *ctx; struct perf_counter_context *ctx;
struct perf_cpu_context *cpuctx; struct perf_cpu_context *cpuctx;
struct task_struct *task; struct task_struct *task;
...@@ -1586,11 +1591,7 @@ static struct perf_counter_context *find_get_context(pid_t pid, int cpu) ...@@ -1586,11 +1591,7 @@ static struct perf_counter_context *find_get_context(pid_t pid, int cpu)
retry: retry:
ctx = perf_lock_task_context(task, &flags); ctx = perf_lock_task_context(task, &flags);
if (ctx) { if (ctx) {
parent_ctx = ctx->parent_ctx; unclone_ctx(ctx);
if (parent_ctx) {
put_ctx(parent_ctx);
ctx->parent_ctx = NULL; /* no longer a clone */
}
spin_unlock_irqrestore(&ctx->lock, flags); spin_unlock_irqrestore(&ctx->lock, flags);
} }
...@@ -4255,15 +4256,12 @@ void perf_counter_exit_task(struct task_struct *child) ...@@ -4255,15 +4256,12 @@ void perf_counter_exit_task(struct task_struct *child)
*/ */
spin_lock(&child_ctx->lock); spin_lock(&child_ctx->lock);
child->perf_counter_ctxp = NULL; child->perf_counter_ctxp = NULL;
if (child_ctx->parent_ctx) {
/* /*
* This context is a clone; unclone it so it can't get * If this context is a clone; unclone it so it can't get
* swapped to another process while we're removing all * swapped to another process while we're removing all
* the counters from it. * the counters from it.
*/ */
put_ctx(child_ctx->parent_ctx); unclone_ctx(child_ctx);
child_ctx->parent_ctx = NULL;
}
spin_unlock(&child_ctx->lock); spin_unlock(&child_ctx->lock);
local_irq_restore(flags); local_irq_restore(flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment