|
@@ -107,6 +107,8 @@ DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new,
|
|
|
#ifdef CREATE_TRACE_POINTS
|
|
|
static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p)
|
|
|
{
|
|
|
+ unsigned int state;
|
|
|
+
|
|
|
#ifdef CONFIG_SCHED_DEBUG
|
|
|
BUG_ON(p != current);
|
|
|
#endif /* CONFIG_SCHED_DEBUG */
|
|
@@ -118,7 +120,15 @@ static inline long __trace_sched_switch_state(bool preempt, struct task_struct *
|
|
|
if (preempt)
|
|
|
return TASK_REPORT_MAX;
|
|
|
|
|
|
- return 1 << task_state_index(p);
|
|
|
+ /*
|
|
|
+ * task_state_index() uses fls() and returns a value from 0-8 range.
|
|
|
+ * Decrement it by 1 (except TASK_RUNNING state i.e 0) before using
|
|
|
+ * it for left shift operation to get the correct task->state
|
|
|
+ * mapping.
|
|
|
+ */
|
|
|
+ state = task_state_index(p);
|
|
|
+
|
|
|
+ return state ? (1 << (state - 1)) : state;
|
|
|
}
|
|
|
#endif /* CREATE_TRACE_POINTS */
|
|
|
|