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

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

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
Loading
Loading
Loading
Loading
+17 −19
Original line number Original line Diff line number Diff line
@@ -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)
	/*
	/*
	 * 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,


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)
 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)
	 */
	 */
	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);