Re: [PATCH 3/4] sched/deadline: Tracepoints for deadline scheduler
From: Peter Zijlstra <peterz@infradead.org>
Date: 2016-02-23 14:28:02
Also in:
lkml
On Tue, Feb 23, 2016 at 11:44:08AM +0100, Peter Zijlstra wrote:
quoted hunk ↗ jump to hunk
include/trace/events/sched.h | 97 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 11 deletions(-)diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 9b90c57517a9..b902eb71830b 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h@@ -103,9 +103,15 @@ DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new, TP_PROTO(struct task_struct *p), TP_ARGS(p)); +#define TASK_STATE_PREEMPT (TASK_STATE_MAX << 0) +#define TASK_STATE_THROTTLED (TASK_STATE_MAX << 1) +#define TASK_STATE_YIELDED (TASK_STATE_MAX << 2) + #ifdef CREATE_TRACE_POINTS static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p) { + long state = p->state; + #ifdef CONFIG_SCHED_DEBUG BUG_ON(p != current); #endif /* CONFIG_SCHED_DEBUG */@@ -114,10 +120,49 @@ static inline long __trace_sched_switch_state(bool preempt, struct task_struct * * Preemption ignores task state, therefore preempted tasks are always * RUNNING (we will not have dequeued if state != RUNNING). */ - return preempt ? TASK_RUNNING | TASK_STATE_MAX : p->state; + if (preempt) { + state = TASK_RUNNING | TASK_STATE_MAX; + } else if (dl_task(p)) { + if (p->dl.dl_throttled) + state |= TASK_STATE_THROTTLED; + else if (p->dl.dl_yielded) + state |= TASK_STATE_YIELDED;
These might want to be inverted, that is, yielded will have throttled set, so yield should take precedence.
+ }
+
+ return state;
}
#endif /* CREATE_TRACE_POINTS */
+#define __trace_sched_switch_fields(name) do { \
+ __entry->name##_policy = name->policy; \
+ switch (name->policy) { \Sadly we cannot use policy, for that isn't updated on PI. The best we can do is dl_task(), rt_task() else ...
+ case SCHED_IDLE: \
This doesn't have nice, so should go with default;
+ case SCHED_BATCH: \ + case SCHED_NORMAL: \ + __entry->name##_f1 = PRIO_TO_NICE(name->static_prio); \ + __entry->name##_f2 = 0; \ + __entry->name##_f3 = 0; \ + break; \ + case SCHED_RR: \ + case SCHED_FIFO: \ + __entry->name##_f1 = USER_PRIO(name->normal_prio); \ + __entry->name##_f2 = 0; \ + __entry->name##_f3 = 0; \ + break; \ + case SCHED_DEADLINE: \ + __entry->name##_f1 = name->dl.runtime; \ + __entry->name##_f2 = name->dl.deadline; \ + __entry->name##_f3 = name->dl.dl_period; \ + break; \ + default: \ + __entry->name##_f1 = 0; \ + __entry->name##_f2 = 0; \ + __entry->name##_f3 = 0; \ + break; \ + } \ +} while (0)