perf_counter, sched: Add sched_stat_runtime tracepoint
This allows more precise tracking of how the scheduler accounts (and acts upon) a task having spent N nanoseconds of CPU time. Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -379,6 +379,39 @@ TRACE_EVENT(sched_stat_wait,
|
|||||||
(unsigned long long)__entry->delay)
|
(unsigned long long)__entry->delay)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tracepoint for accounting runtime (time the task is executing
|
||||||
|
* on a CPU).
|
||||||
|
*/
|
||||||
|
TRACE_EVENT(sched_stat_runtime,
|
||||||
|
|
||||||
|
TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
|
||||||
|
|
||||||
|
TP_ARGS(tsk, runtime, vruntime),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__array( char, comm, TASK_COMM_LEN )
|
||||||
|
__field( pid_t, pid )
|
||||||
|
__field( u64, runtime )
|
||||||
|
__field( u64, vruntime )
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
|
||||||
|
__entry->pid = tsk->pid;
|
||||||
|
__entry->runtime = runtime;
|
||||||
|
__entry->vruntime = vruntime;
|
||||||
|
)
|
||||||
|
TP_perf_assign(
|
||||||
|
__perf_count(runtime);
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("task: %s:%d runtime: %Lu [ns], vruntime: %Lu [ns]",
|
||||||
|
__entry->comm, __entry->pid,
|
||||||
|
(unsigned long long)__entry->runtime,
|
||||||
|
(unsigned long long)__entry->vruntime)
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tracepoint for accounting sleep time (time the task is not runnable,
|
* Tracepoint for accounting sleep time (time the task is not runnable,
|
||||||
* including iowait, see below).
|
* including iowait, see below).
|
||||||
|
@@ -513,6 +513,7 @@ static void update_curr(struct cfs_rq *cfs_rq)
|
|||||||
if (entity_is_task(curr)) {
|
if (entity_is_task(curr)) {
|
||||||
struct task_struct *curtask = task_of(curr);
|
struct task_struct *curtask = task_of(curr);
|
||||||
|
|
||||||
|
trace_sched_stat_runtime(curtask, delta_exec, curr->vruntime);
|
||||||
cpuacct_charge(curtask, delta_exec);
|
cpuacct_charge(curtask, delta_exec);
|
||||||
account_group_exec_runtime(curtask, delta_exec);
|
account_group_exec_runtime(curtask, delta_exec);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user