diff options
| -rw-r--r-- | kernel/sched.c | 28 | ||||
| -rw-r--r-- | kernel/sched_debug.c | 22 | ||||
| -rw-r--r-- | kernel/sched_fair.c | 4 | ||||
| -rw-r--r-- | kernel/sched_rt.c | 4 |
4 files changed, 38 insertions, 20 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index a9d374061a46..72bb9483d949 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -983,18 +983,21 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu) | |||
| 983 | u64 clock_offset, fair_clock_offset; | 983 | u64 clock_offset, fair_clock_offset; |
| 984 | 984 | ||
| 985 | clock_offset = old_rq->clock - new_rq->clock; | 985 | clock_offset = old_rq->clock - new_rq->clock; |
| 986 | fair_clock_offset = old_rq->cfs.fair_clock - | 986 | fair_clock_offset = old_rq->cfs.fair_clock - new_rq->cfs.fair_clock; |
| 987 | new_rq->cfs.fair_clock; | 987 | |
| 988 | if (p->se.wait_start) | ||
| 989 | p->se.wait_start -= clock_offset; | ||
| 990 | if (p->se.wait_start_fair) | 988 | if (p->se.wait_start_fair) |
| 991 | p->se.wait_start_fair -= fair_clock_offset; | 989 | p->se.wait_start_fair -= fair_clock_offset; |
| 990 | if (p->se.sleep_start_fair) | ||
| 991 | p->se.sleep_start_fair -= fair_clock_offset; | ||
| 992 | |||
| 993 | #ifdef CONFIG_SCHEDSTATS | ||
| 994 | if (p->se.wait_start) | ||
| 995 | p->se.wait_start -= clock_offset; | ||
| 992 | if (p->se.sleep_start) | 996 | if (p->se.sleep_start) |
| 993 | p->se.sleep_start -= clock_offset; | 997 | p->se.sleep_start -= clock_offset; |
| 994 | if (p->se.block_start) | 998 | if (p->se.block_start) |
| 995 | p->se.block_start -= clock_offset; | 999 | p->se.block_start -= clock_offset; |
| 996 | if (p->se.sleep_start_fair) | 1000 | #endif |
| 997 | p->se.sleep_start_fair -= fair_clock_offset; | ||
| 998 | 1001 | ||
| 999 | __set_task_cpu(p, new_cpu); | 1002 | __set_task_cpu(p, new_cpu); |
| 1000 | } | 1003 | } |
| @@ -1555,17 +1558,19 @@ int fastcall wake_up_state(struct task_struct *p, unsigned int state) | |||
| 1555 | static void __sched_fork(struct task_struct *p) | 1558 | static void __sched_fork(struct task_struct *p) |
| 1556 | { | 1559 | { |
| 1557 | p->se.wait_start_fair = 0; | 1560 | p->se.wait_start_fair = 0; |
| 1558 | p->se.wait_start = 0; | ||
| 1559 | p->se.exec_start = 0; | 1561 | p->se.exec_start = 0; |
| 1560 | p->se.sum_exec_runtime = 0; | 1562 | p->se.sum_exec_runtime = 0; |
| 1561 | p->se.delta_exec = 0; | 1563 | p->se.delta_exec = 0; |
| 1562 | p->se.delta_fair_run = 0; | 1564 | p->se.delta_fair_run = 0; |
| 1563 | p->se.delta_fair_sleep = 0; | 1565 | p->se.delta_fair_sleep = 0; |
| 1564 | p->se.wait_runtime = 0; | 1566 | p->se.wait_runtime = 0; |
| 1567 | p->se.sleep_start_fair = 0; | ||
| 1568 | |||
| 1569 | #ifdef CONFIG_SCHEDSTATS | ||
| 1570 | p->se.wait_start = 0; | ||
| 1565 | p->se.sum_wait_runtime = 0; | 1571 | p->se.sum_wait_runtime = 0; |
| 1566 | p->se.sum_sleep_runtime = 0; | 1572 | p->se.sum_sleep_runtime = 0; |
| 1567 | p->se.sleep_start = 0; | 1573 | p->se.sleep_start = 0; |
| 1568 | p->se.sleep_start_fair = 0; | ||
| 1569 | p->se.block_start = 0; | 1574 | p->se.block_start = 0; |
| 1570 | p->se.sleep_max = 0; | 1575 | p->se.sleep_max = 0; |
| 1571 | p->se.block_max = 0; | 1576 | p->se.block_max = 0; |
| @@ -1573,6 +1578,7 @@ static void __sched_fork(struct task_struct *p) | |||
| 1573 | p->se.wait_max = 0; | 1578 | p->se.wait_max = 0; |
| 1574 | p->se.wait_runtime_overruns = 0; | 1579 | p->se.wait_runtime_overruns = 0; |
| 1575 | p->se.wait_runtime_underruns = 0; | 1580 | p->se.wait_runtime_underruns = 0; |
| 1581 | #endif | ||
| 1576 | 1582 | ||
| 1577 | INIT_LIST_HEAD(&p->run_list); | 1583 | INIT_LIST_HEAD(&p->run_list); |
| 1578 | p->se.on_rq = 0; | 1584 | p->se.on_rq = 0; |
| @@ -6579,12 +6585,14 @@ void normalize_rt_tasks(void) | |||
| 6579 | do_each_thread(g, p) { | 6585 | do_each_thread(g, p) { |
| 6580 | p->se.fair_key = 0; | 6586 | p->se.fair_key = 0; |
| 6581 | p->se.wait_runtime = 0; | 6587 | p->se.wait_runtime = 0; |
| 6588 | p->se.exec_start = 0; | ||
| 6582 | p->se.wait_start_fair = 0; | 6589 | p->se.wait_start_fair = 0; |
| 6590 | p->se.sleep_start_fair = 0; | ||
| 6591 | #ifdef CONFIG_SCHEDSTATS | ||
| 6583 | p->se.wait_start = 0; | 6592 | p->se.wait_start = 0; |
| 6584 | p->se.exec_start = 0; | ||
| 6585 | p->se.sleep_start = 0; | 6593 | p->se.sleep_start = 0; |
| 6586 | p->se.sleep_start_fair = 0; | ||
| 6587 | p->se.block_start = 0; | 6594 | p->se.block_start = 0; |
| 6595 | #endif | ||
| 6588 | task_rq(p)->cfs.fair_clock = 0; | 6596 | task_rq(p)->cfs.fair_clock = 0; |
| 6589 | task_rq(p)->clock = 0; | 6597 | task_rq(p)->clock = 0; |
| 6590 | 6598 | ||
diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c index 0eca442b7792..1c61e5315ad2 100644 --- a/kernel/sched_debug.c +++ b/kernel/sched_debug.c | |||
| @@ -44,11 +44,16 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p, u64 now) | |||
| 44 | (long long)p->se.wait_runtime, | 44 | (long long)p->se.wait_runtime, |
| 45 | (long long)(p->nvcsw + p->nivcsw), | 45 | (long long)(p->nvcsw + p->nivcsw), |
| 46 | p->prio, | 46 | p->prio, |
| 47 | #ifdef CONFIG_SCHEDSTATS | ||
| 47 | (long long)p->se.sum_exec_runtime, | 48 | (long long)p->se.sum_exec_runtime, |
| 48 | (long long)p->se.sum_wait_runtime, | 49 | (long long)p->se.sum_wait_runtime, |
| 49 | (long long)p->se.sum_sleep_runtime, | 50 | (long long)p->se.sum_sleep_runtime, |
| 50 | (long long)p->se.wait_runtime_overruns, | 51 | (long long)p->se.wait_runtime_overruns, |
| 51 | (long long)p->se.wait_runtime_underruns); | 52 | (long long)p->se.wait_runtime_underruns |
| 53 | #else | ||
| 54 | 0LL, 0LL, 0LL, 0LL, 0LL | ||
| 55 | #endif | ||
| 56 | ); | ||
| 52 | } | 57 | } |
| 53 | 58 | ||
| 54 | static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu, u64 now) | 59 | static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu, u64 now) |
| @@ -171,7 +176,7 @@ static int sched_debug_show(struct seq_file *m, void *v) | |||
| 171 | u64 now = ktime_to_ns(ktime_get()); | 176 | u64 now = ktime_to_ns(ktime_get()); |
| 172 | int cpu; | 177 | int cpu; |
| 173 | 178 | ||
| 174 | SEQ_printf(m, "Sched Debug Version: v0.05, %s %.*s\n", | 179 | SEQ_printf(m, "Sched Debug Version: v0.05-v20, %s %.*s\n", |
| 175 | init_utsname()->release, | 180 | init_utsname()->release, |
| 176 | (int)strcspn(init_utsname()->version, " "), | 181 | (int)strcspn(init_utsname()->version, " "), |
| 177 | init_utsname()->version); | 182 | init_utsname()->version); |
| @@ -235,21 +240,24 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) | |||
| 235 | #define P(F) \ | 240 | #define P(F) \ |
| 236 | SEQ_printf(m, "%-25s:%20Ld\n", #F, (long long)p->F) | 241 | SEQ_printf(m, "%-25s:%20Ld\n", #F, (long long)p->F) |
| 237 | 242 | ||
| 238 | P(se.wait_start); | 243 | P(se.wait_runtime); |
| 239 | P(se.wait_start_fair); | 244 | P(se.wait_start_fair); |
| 240 | P(se.exec_start); | 245 | P(se.exec_start); |
| 241 | P(se.sleep_start); | ||
| 242 | P(se.sleep_start_fair); | 246 | P(se.sleep_start_fair); |
| 247 | P(se.sum_exec_runtime); | ||
| 248 | |||
| 249 | #ifdef CONFIG_SCHEDSTATS | ||
| 250 | P(se.wait_start); | ||
| 251 | P(se.sleep_start); | ||
| 243 | P(se.block_start); | 252 | P(se.block_start); |
| 244 | P(se.sleep_max); | 253 | P(se.sleep_max); |
| 245 | P(se.block_max); | 254 | P(se.block_max); |
| 246 | P(se.exec_max); | 255 | P(se.exec_max); |
| 247 | P(se.wait_max); | 256 | P(se.wait_max); |
| 248 | P(se.wait_runtime); | ||
| 249 | P(se.wait_runtime_overruns); | 257 | P(se.wait_runtime_overruns); |
| 250 | P(se.wait_runtime_underruns); | 258 | P(se.wait_runtime_underruns); |
| 251 | P(se.sum_wait_runtime); | 259 | P(se.sum_wait_runtime); |
| 252 | P(se.sum_exec_runtime); | 260 | #endif |
| 253 | SEQ_printf(m, "%-25s:%20Ld\n", | 261 | SEQ_printf(m, "%-25s:%20Ld\n", |
| 254 | "nr_switches", (long long)(p->nvcsw + p->nivcsw)); | 262 | "nr_switches", (long long)(p->nvcsw + p->nivcsw)); |
| 255 | P(se.load.weight); | 263 | P(se.load.weight); |
| @@ -269,7 +277,9 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) | |||
| 269 | 277 | ||
| 270 | void proc_sched_set_task(struct task_struct *p) | 278 | void proc_sched_set_task(struct task_struct *p) |
| 271 | { | 279 | { |
| 280 | #ifdef CONFIG_SCHEDSTATS | ||
| 272 | p->se.sleep_max = p->se.block_max = p->se.exec_max = p->se.wait_max = 0; | 281 | p->se.sleep_max = p->se.block_max = p->se.exec_max = p->se.wait_max = 0; |
| 273 | p->se.wait_runtime_overruns = p->se.wait_runtime_underruns = 0; | 282 | p->se.wait_runtime_overruns = p->se.wait_runtime_underruns = 0; |
| 283 | #endif | ||
| 274 | p->se.sum_exec_runtime = 0; | 284 | p->se.sum_exec_runtime = 0; |
| 275 | } | 285 | } |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 5bf7285ad02c..6f579ff5a9bc 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -349,7 +349,7 @@ static inline void | |||
| 349 | update_stats_wait_start(struct cfs_rq *cfs_rq, struct sched_entity *se, u64 now) | 349 | update_stats_wait_start(struct cfs_rq *cfs_rq, struct sched_entity *se, u64 now) |
| 350 | { | 350 | { |
| 351 | se->wait_start_fair = cfs_rq->fair_clock; | 351 | se->wait_start_fair = cfs_rq->fair_clock; |
| 352 | se->wait_start = now; | 352 | schedstat_set(se->wait_start, now); |
| 353 | } | 353 | } |
| 354 | 354 | ||
| 355 | /* | 355 | /* |
| @@ -447,7 +447,7 @@ update_stats_wait_end(struct cfs_rq *cfs_rq, struct sched_entity *se, u64 now) | |||
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | se->wait_start_fair = 0; | 449 | se->wait_start_fair = 0; |
| 450 | se->wait_start = 0; | 450 | schedstat_set(se->wait_start, 0); |
| 451 | } | 451 | } |
| 452 | 452 | ||
| 453 | static inline void | 453 | static inline void |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index ade20dc422f1..002fcf8d3f64 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -18,8 +18,8 @@ static inline void update_curr_rt(struct rq *rq, u64 now) | |||
| 18 | delta_exec = now - curr->se.exec_start; | 18 | delta_exec = now - curr->se.exec_start; |
| 19 | if (unlikely((s64)delta_exec < 0)) | 19 | if (unlikely((s64)delta_exec < 0)) |
| 20 | delta_exec = 0; | 20 | delta_exec = 0; |
| 21 | if (unlikely(delta_exec > curr->se.exec_max)) | 21 | |
| 22 | curr->se.exec_max = delta_exec; | 22 | schedstat_set(curr->se.exec_max, max(curr->se.exec_max, delta_exec)); |
| 23 | 23 | ||
| 24 | curr->se.sum_exec_runtime += delta_exec; | 24 | curr->se.sum_exec_runtime += delta_exec; |
| 25 | curr->se.exec_start = now; | 25 | curr->se.exec_start = now; |
