ANDROID: trace: sched: add sched blocked tracepoint which dumps out context of sleep.
Decare war on uninterruptible sleep. Add a tracepoint which walks the kernel stack and dumps the first non-scheduler function called before the scheduler is invoked. Change-Id: I19e965d5206329360a92cbfe2afcc8c30f65c229 Signed-off-by: Riley Andrews <riandrews@google.com>
This commit is contained in:
parent
3d07cba37a
commit
8a0d35fe7b
2 changed files with 26 additions and 1 deletions
|
@ -226,7 +226,7 @@ DECLARE_EVENT_CLASS(sched_process_template,
|
|||
DEFINE_EVENT(sched_process_template, sched_process_free,
|
||||
TP_PROTO(struct task_struct *p),
|
||||
TP_ARGS(p));
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Tracepoint for a task exiting:
|
||||
|
@ -380,6 +380,30 @@ DEFINE_EVENT(sched_stat_template, sched_stat_blocked,
|
|||
TP_PROTO(struct task_struct *tsk, u64 delay),
|
||||
TP_ARGS(tsk, delay));
|
||||
|
||||
/*
|
||||
* Tracepoint for recording the cause of uninterruptible sleep.
|
||||
*/
|
||||
TRACE_EVENT(sched_blocked_reason,
|
||||
|
||||
TP_PROTO(struct task_struct *tsk),
|
||||
|
||||
TP_ARGS(tsk),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( pid_t, pid )
|
||||
__field( void*, caller )
|
||||
__field( bool, io_wait )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->pid = tsk->pid;
|
||||
__entry->caller = (void*)get_wchan(tsk);
|
||||
__entry->io_wait = tsk->in_iowait;
|
||||
),
|
||||
|
||||
TP_printk("pid=%d iowait=%d caller=%pS", __entry->pid, __entry->io_wait, __entry->caller)
|
||||
);
|
||||
|
||||
/*
|
||||
* Tracepoint for accounting runtime (time the task is executing
|
||||
* on a CPU).
|
||||
|
|
|
@ -941,6 +941,7 @@ update_stats_enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
|||
}
|
||||
|
||||
trace_sched_stat_blocked(tsk, delta);
|
||||
trace_sched_blocked_reason(tsk);
|
||||
|
||||
/*
|
||||
* Blocking time is in units of nanosecs, so shift by
|
||||
|
|
Loading…
Reference in a new issue