Re: [RFC][PATCH v2 1/7] taskstats: Add new taskstats commandTASKSTATS_CMD_ATTR_PIDS

From: Michael Holzheu
Date: Mon Nov 15 2010 - 12:09:38 EST


Hello Peter,

On Mon, 2010-11-15 at 17:06 +0100, Peter Zijlstra wrote:
> On Mon, 2010-11-15 at 16:53 +0100, Michael Holzheu wrote:
> > Hello Peter,
> >
> > On Sat, 2010-11-13 at 20:20 +0100, Peter Zijlstra wrote:
> > > On Thu, 2010-11-11 at 18:03 +0100, Michael Holzheu wrote:
> > > > As clock for 'now' and 'time' the sched_clock() function is used and the patch
> > >
> > > > + preempt_disable();
> > > > + stats->time_ns = sched_clock();
> > > > + preempt_enable();
> > >
> > > > + task_snap_time = sched_clock();
> > >
> > > That's just plain broken...
> >
> > What exactly do you mean? Do you mean that we should not use
> > sched_clock() in general or that it is called twice?
>
> That you should not use sched_clock(),

What should we use instead?

> and if you do (you really
> shouldn't) you should have disabled IRQs around it.
>
> > >
> > >
> > > > + t->sched_info.last_depart = task_rq(t)->clock;
> > >
> > > Are you sure you don't mean task_rq(t)->clock_task ?
> >
> > Maybe... I want to save in "last_depart" a sched_clock() timestamp that
> > is as precise as possible.
> >
> > We use "last_depart" for the TASKSTATS_CMD_ATTR_PIDS command to find out
> > which tasks have been running on a CPU since the last taskstats
> > snapshot. We return all tasks where last_depart > MIN(stats->time_ns for
> > all tasks of last snapshot).
>
> What does last departed mean? That is what timeline are you counting in?
> Do you want time as tasks see it, or time as your wallclock sees it?

"last_depart" should be the time stamp, where the task has left a CPU
the last time.

We assume that we can compare "last_depart" with "time_ns" in the
taskstats structure, if we use task_rq(t)->clock for last_depart and
sched_clock() for stats->time_ns. We also assume that we get wallclock
intervals in nanoseconds, if we look at two sched_clock() timestamps.

"stats->time_ns" is used as timestamp for the next snapshot query and
for calculation of the snapshot interval time. So there are three
important timestamps:
* struct task_struct:
sched_info.last_depart: Last time task has left CPU
* struct taskstats:
time_ns: Timestamp where taskstats data is generated
* sturuct cmd_pids:
time_ns: Timestamp for TASKSTATS_CMD_ATTR_PIDS command.

Example:
1. Get initial snapshot with cmd_pids->time_ns=0:
- All tasks are returned.
snapshot_time = MIN(stats->time_ns) for all received taskstats
2. Get second snapshot with cmd_pids->time_ns = snapshot_time
- Only tasks that were active after "snapshot_time" are returned.

Michael

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