Skip to contentSkip to conversation

perf: do not set task_ctx pointer in cpuctx if there is no events in the context

PATCH In review Gleb Natapov 2 participants 6 messages Oct 23, 2011 – Nov 18, 2011 perf events

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 perf: do not set task_ctx pointer in cpuctx if there is no events in the context

Do not set task_ctx pointer during sched_in if there is no events associated with the context. Otherwise if during task execution total number of events in the system will become zero perf_event_context_sched_out() will not be called and cpuctx->task_ctx will be left with a stale value.

kernel/events/core.c +2 -1
index 0f85778..68b13ee 100644
@@ -2172,7 +2172,8 @@ static void perf_event_context_sched_in(struct perf_event_context *ctx,
 
 	perf_event_sched_in(cpuctx, ctx, task);
 
-	cpuctx->task_ctx = ctx;
+	if (ctx->nr_events)
+		cpuctx->task_ctx = ctx;
 
 	perf_pmu_enable(ctx->pmu);
 	perf_ctx_unlock(cpuctx, ctx);

--
Gleb.

#1 lore raw

Ingo, Peter can you look into this please.

Quoted 22 lines · Gleb Natapov

Do not set task_ctx pointer during sched_in if there is no events associated with the context. Otherwise if during task execution total number of events in the system will become zero perf_event_context_sched_out() will not be called and cpuctx->task_ctx will be left with a stale value.

kernel/events/core.c +2 -2
index 0f85778..68b13ee 100644
@@ -2172,7 +2172,8 @@ static void perf_event_context_sched_in(struct perf_event_context *ctx,
 
 	perf_event_sched_in(cpuctx, ctx, task);
 
-	cpuctx->task_ctx = ctx;
+	if (ctx->nr_events)
+		cpuctx->task_ctx = ctx;
 
 	perf_pmu_enable(ctx->pmu);
 	perf_ctx_unlock(cpuctx, ctx);
--
Quoted 6 lines

Gleb.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

--
Gleb.

#2 lore raw
Quoted 1 line · Gleb Natapov

Ingo, Peter can you look into this please.

queued it and the jump_label thing.

#3 lore raw
Quoted 4 lines · Peter Zijlstra
Quoted 1 line · Gleb Natapov

Ingo, Peter can you look into this please.

queued it and the jump_label thing.

I see jump_label thing in tip/perf/core but not this one yet. This is good because this one needs amendment :) See below.

---

Do not set task_ctx pointer during sched_in if there is no events associated with the context. Otherwise if during task execution total number of events in the system will become zero perf_event_context_sched_out() will not be called and cpuctx->task_ctx will be left with a stale value. Also perf_event_sched_in() shouldn't try to schedule task events in this case otherwise cpuctx->task_ctx->is_active will not be cleared during sched_out and will become incorrect.

kernel/events/core.c +3 -2
index d1a1bee..7210657 100644
@@ -2171,9 +2171,10 @@ static void perf_event_context_sched_in(struct perf_event_context *ctx,
 	 */
 	cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE);
 
-	perf_event_sched_in(cpuctx, ctx, task);
+	if (ctx->nr_events)
+		cpuctx->task_ctx = ctx;
 
-	cpuctx->task_ctx = ctx;
+	perf_event_sched_in(cpuctx, cpuctx->task_ctx, task);
 
 	perf_pmu_enable(ctx->pmu);
 	perf_ctx_unlock(cpuctx, ctx);

--
Gleb.

#4 lore raw
Quoted 7 lines · Gleb Natapov
Quoted 4 lines · Peter Zijlstra
Quoted 1 line · Gleb Natapov

Ingo, Peter can you look into this please.

queued it and the jump_label thing.

I see jump_label thing in tip/perf/core but not this one yet. This is good because this one needs amendment :) See below.

Weird ass stuff, because my copy still applies to tip/master. Ingo, wtf is up?

Quoted 11 lines

---

Do not set task_ctx pointer during sched_in if there is no events associated with the context. Otherwise if during task execution total number of events in the system will become zero perf_event_context_sched_out() will not be called and cpuctx->task_ctx will be left with a stale value. Also perf_event_sched_in() shouldn't try to schedule task events in this case otherwise cpuctx->task_ctx->is_active will not be cleared during sched_out and will become incorrect.

--- missing right there

Quoted 19 lines
kernel/events/core.c +3 -3
index d1a1bee..7210657 100644
@@ -2171,9 +2171,10 @@ static void perf_event_context_sched_in(struct perf_event_context *ctx,
 	 */
 	cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE);
 
-	perf_event_sched_in(cpuctx, ctx, task);
+	if (ctx->nr_events)
+		cpuctx->task_ctx = ctx;
 
-	cpuctx->task_ctx = ctx;
+	perf_event_sched_in(cpuctx, cpuctx->task_ctx, task);
 
 	perf_pmu_enable(ctx->pmu);
 	perf_ctx_unlock(cpuctx, ctx);
--

Gleb.

#5 lore raw

[tip:perf/urgent] perf: Do not set task_ctx pointer in cpuctx if there are no events in the context

In reply to Gleb Natapov
Commit-ID:  1d5f003f5a964711853514b04ddc872eec0fdc7b
Gitweb:     http://git.kernel.org/tip/1d5f003f5a964711853514b04ddc872eec0fdc7b
Author:     Gleb Natapov <[email protected]>
AuthorDate: Sun, 23 Oct 2011 19:10:33 +0200
Committer:  Ingo Molnar <[email protected]>
CommitDate: Mon, 14 Nov 2011 13:01:21 +0100

perf: Do not set task_ctx pointer in cpuctx if there are no events in the context

Do not set task_ctx pointer during sched_in if there are no events associated with the context. Otherwise if during task execution total number of events in the system will become zero perf_event_context_sched_out() will not be called and cpuctx->task_ctx will be left with a stale value.

---
 kernel/events/core.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)
kernel/events/core.c +2 -1
index 0e8457d..b0c1186 100644
@@ -2173,7 +2173,8 @@ static void perf_event_context_sched_in(struct perf_event_context *ctx,
 
 	perf_event_sched_in(cpuctx, ctx, task);
 
-	cpuctx->task_ctx = ctx;
+	if (ctx->nr_events)
+		cpuctx->task_ctx = ctx;
 
 	perf_pmu_enable(ctx->pmu);
 	perf_ctx_unlock(cpuctx, ctx);