Commit 9a41785cc43d88397f787a651ed7286a33f8462f

Authored by Balbir Singh
Committed by Ingo Molnar
1 parent b2be5e96dc

sched: fix delay accounting regression

Fix the delay accounting regression introduced by commit
75d4ef16a6aa84f708188bada182315f80aab6fa. rq no longer has sched_info
data associated with it. task_struct sched_info structure is used by delay
accounting to provide back statistics to user space.

also remove direct use of sched_clock() (which is not a valid thing to
do anymore) and use rq->clock instead.

Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

Showing 1 changed file with 6 additions and 5 deletions Side-by-side Diff

kernel/sched_stats.h
... ... @@ -127,7 +127,7 @@
127 127 # define schedstat_set(var, val) do { } while (0)
128 128 #endif
129 129  
130   -#ifdef CONFIG_SCHEDSTATS
  130 +#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)
131 131 /*
132 132 * Called when a process is dequeued from the active array and given
133 133 * the cpu. We should note that with the exception of interactive
... ... @@ -155,7 +155,7 @@
155 155 */
156 156 static void sched_info_arrive(struct task_struct *t)
157 157 {
158   - unsigned long long now = sched_clock(), delta = 0;
  158 + unsigned long long now = task_rq(t)->clock, delta = 0;
159 159  
160 160 if (t->sched_info.last_queued)
161 161 delta = now - t->sched_info.last_queued;
... ... @@ -186,7 +186,7 @@
186 186 {
187 187 if (unlikely(sched_info_on()))
188 188 if (!t->sched_info.last_queued)
189   - t->sched_info.last_queued = sched_clock();
  189 + t->sched_info.last_queued = task_rq(t)->clock;
190 190 }
191 191  
192 192 /*
... ... @@ -195,7 +195,8 @@
195 195 */
196 196 static inline void sched_info_depart(struct task_struct *t)
197 197 {
198   - unsigned long long delta = sched_clock() - t->sched_info.last_arrival;
  198 + unsigned long long delta = task_rq(t)->clock -
  199 + t->sched_info.last_arrival;
199 200  
200 201 t->sched_info.cpu_time += delta;
201 202 rq_sched_info_depart(task_rq(t), delta);
... ... @@ -231,5 +232,5 @@
231 232 #else
232 233 #define sched_info_queued(t) do { } while (0)
233 234 #define sched_info_switch(t, next) do { } while (0)
234   -#endif /* CONFIG_SCHEDSTATS */
  235 +#endif /* CONFIG_SCHEDSTATS || CONFIG_TASK_DELAY_ACCT */