Messages in this thread | | | Date | Sun, 24 May 2009 13:33:15 +0200 | From | Ingo Molnar <> | Subject | Re: [tip:perfcounters/core] perf_counter: Optimize context switch between identical inherited contexts |
| |
* tip-bot for Paul Mackerras <paulus@samba.org> wrote:
> @@ -885,6 +934,16 @@ void perf_counter_task_sched_out(struct task_struct *task, int cpu) > > regs = task_pt_regs(task); > perf_swcounter_event(PERF_COUNT_CONTEXT_SWITCHES, 1, 1, regs, 0); > + > + next_ctx = next->perf_counter_ctxp; > + if (next_ctx && context_equiv(ctx, next_ctx)) { > + task->perf_counter_ctxp = next_ctx; > + next->perf_counter_ctxp = ctx; > + ctx->task = next; > + next_ctx->task = task; > + return; > + }
there's one complication that this trick is causing - the migration counter relies on ctx->task to get per task migration stats:
static inline u64 get_cpu_migrations(struct perf_counter *counter) { struct task_struct *curr = counter->ctx->task;
if (curr) return curr->se.nr_migrations; return cpu_nr_migrations(smp_processor_id()); }
as ctx->task is now jumping (while we keep the context), the migration stats are out of whack.
Ingo
| |