Peter, On Wed, Jan 5, 2011 at 2:01 PM, Stephane Eranian <eran...@google.com> wrote: > On Wed, Jan 5, 2011 at 12:23 PM, Peter Zijlstra <pet...@infradead.org> wrote: >> On Mon, 2011-01-03 at 18:20 +0200, Stephane Eranian wrote: >>> +void >>> +perf_cgroup_switch(struct task_struct *task, struct task_struct *next) >>> +{ >>> + struct perf_cgroup *cgrp_out = perf_cgroup_from_task(task); >>> + struct perf_cgroup *cgrp_in = perf_cgroup_from_task(next); >>> + struct perf_cpu_context *cpuctx; >>> + struct pmu *pmu; >>> + /* >>> + * if task is DEAD, then css_out is irrelevant, it has >>> + * been changed to init_cgrp in cgroup_exit() from do_exit(). >>> + * Furthermore, perf_cgroup_exit_task(), has scheduled out >>> + * all css constrained events, only unconstrained events >>> + * remain. Therefore we need to reschedule based on css_in. >>> + */ >>> + if (task->state != TASK_DEAD && cgrp_out == cgrp_in) >>> + return; >> >> I think that check is broken, TASK_DEAD is set way after calling >> cgroup_exit(), so if we get preempted in between there you'll still go >> funny. >>
I looked at this part again. The original code checking for TASK_DEAD is correct. The reason is simple, you're looking at perf_cgroup_switch() which is invoked as part of schedule() and NOT perf_event_task_exit() (called prior to cgroup_exit()). Thus, by the time you do the final schedule(), the task state has indeed been switched to TASK_DEAD. I remember testing for this condition during the debug phase. I will resubmit with the other smaller cleanups. ------------------------------------------------------------------------------ Learn how Oracle Real Application Clusters (RAC) One Node allows customers to consolidate database storage, standardize their database environment, and, should the need arise, upgrade to a full multi-node Oracle RAC database without downtime or disruption http://p.sf.net/sfu/oracle-sfdevnl _______________________________________________ perfmon2-devel mailing list perfmon2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perfmon2-devel