diff options
Diffstat (limited to 'kernel/sched/debug.c')
| -rw-r--r-- | kernel/sched/debug.c | 103 |
1 files changed, 39 insertions, 64 deletions
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 72c401b3b15c..15b10e210a6b 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * kernel/sched/debug.c | 2 | * kernel/sched/debug.c |
| 3 | * | 3 | * |
| 4 | * Print the CFS rbtree | 4 | * Print the CFS rbtree and other debugging details |
| 5 | * | 5 | * |
| 6 | * Copyright(C) 2007, Red Hat, Inc., Ingo Molnar | 6 | * Copyright(C) 2007, Red Hat, Inc., Ingo Molnar |
| 7 | * | 7 | * |
| @@ -9,16 +9,6 @@ | |||
| 9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | */ | 11 | */ |
| 12 | |||
| 13 | #include <linux/proc_fs.h> | ||
| 14 | #include <linux/sched/mm.h> | ||
| 15 | #include <linux/sched/task.h> | ||
| 16 | #include <linux/seq_file.h> | ||
| 17 | #include <linux/kallsyms.h> | ||
| 18 | #include <linux/utsname.h> | ||
| 19 | #include <linux/mempolicy.h> | ||
| 20 | #include <linux/debugfs.h> | ||
| 21 | |||
| 22 | #include "sched.h" | 12 | #include "sched.h" |
| 23 | 13 | ||
| 24 | static DEFINE_SPINLOCK(sched_debug_lock); | 14 | static DEFINE_SPINLOCK(sched_debug_lock); |
| @@ -274,34 +264,19 @@ sd_alloc_ctl_domain_table(struct sched_domain *sd) | |||
| 274 | if (table == NULL) | 264 | if (table == NULL) |
| 275 | return NULL; | 265 | return NULL; |
| 276 | 266 | ||
| 277 | set_table_entry(&table[0], "min_interval", &sd->min_interval, | 267 | set_table_entry(&table[0] , "min_interval", &sd->min_interval, sizeof(long), 0644, proc_doulongvec_minmax, false); |
| 278 | sizeof(long), 0644, proc_doulongvec_minmax, false); | 268 | set_table_entry(&table[1] , "max_interval", &sd->max_interval, sizeof(long), 0644, proc_doulongvec_minmax, false); |
| 279 | set_table_entry(&table[1], "max_interval", &sd->max_interval, | 269 | set_table_entry(&table[2] , "busy_idx", &sd->busy_idx, sizeof(int) , 0644, proc_dointvec_minmax, true ); |
| 280 | sizeof(long), 0644, proc_doulongvec_minmax, false); | 270 | set_table_entry(&table[3] , "idle_idx", &sd->idle_idx, sizeof(int) , 0644, proc_dointvec_minmax, true ); |
| 281 | set_table_entry(&table[2], "busy_idx", &sd->busy_idx, | 271 | set_table_entry(&table[4] , "newidle_idx", &sd->newidle_idx, sizeof(int) , 0644, proc_dointvec_minmax, true ); |
| 282 | sizeof(int), 0644, proc_dointvec_minmax, true); | 272 | set_table_entry(&table[5] , "wake_idx", &sd->wake_idx, sizeof(int) , 0644, proc_dointvec_minmax, true ); |
| 283 | set_table_entry(&table[3], "idle_idx", &sd->idle_idx, | 273 | set_table_entry(&table[6] , "forkexec_idx", &sd->forkexec_idx, sizeof(int) , 0644, proc_dointvec_minmax, true ); |
| 284 | sizeof(int), 0644, proc_dointvec_minmax, true); | 274 | set_table_entry(&table[7] , "busy_factor", &sd->busy_factor, sizeof(int) , 0644, proc_dointvec_minmax, false); |
| 285 | set_table_entry(&table[4], "newidle_idx", &sd->newidle_idx, | 275 | set_table_entry(&table[8] , "imbalance_pct", &sd->imbalance_pct, sizeof(int) , 0644, proc_dointvec_minmax, false); |
| 286 | sizeof(int), 0644, proc_dointvec_minmax, true); | 276 | set_table_entry(&table[9] , "cache_nice_tries", &sd->cache_nice_tries, sizeof(int) , 0644, proc_dointvec_minmax, false); |
| 287 | set_table_entry(&table[5], "wake_idx", &sd->wake_idx, | 277 | set_table_entry(&table[10], "flags", &sd->flags, sizeof(int) , 0644, proc_dointvec_minmax, false); |
| 288 | sizeof(int), 0644, proc_dointvec_minmax, true); | 278 | set_table_entry(&table[11], "max_newidle_lb_cost", &sd->max_newidle_lb_cost, sizeof(long), 0644, proc_doulongvec_minmax, false); |
| 289 | set_table_entry(&table[6], "forkexec_idx", &sd->forkexec_idx, | 279 | set_table_entry(&table[12], "name", sd->name, CORENAME_MAX_SIZE, 0444, proc_dostring, false); |
| 290 | sizeof(int), 0644, proc_dointvec_minmax, true); | ||
| 291 | set_table_entry(&table[7], "busy_factor", &sd->busy_factor, | ||
| 292 | sizeof(int), 0644, proc_dointvec_minmax, false); | ||
| 293 | set_table_entry(&table[8], "imbalance_pct", &sd->imbalance_pct, | ||
| 294 | sizeof(int), 0644, proc_dointvec_minmax, false); | ||
| 295 | set_table_entry(&table[9], "cache_nice_tries", | ||
| 296 | &sd->cache_nice_tries, | ||
| 297 | sizeof(int), 0644, proc_dointvec_minmax, false); | ||
| 298 | set_table_entry(&table[10], "flags", &sd->flags, | ||
| 299 | sizeof(int), 0644, proc_dointvec_minmax, false); | ||
| 300 | set_table_entry(&table[11], "max_newidle_lb_cost", | ||
| 301 | &sd->max_newidle_lb_cost, | ||
| 302 | sizeof(long), 0644, proc_doulongvec_minmax, false); | ||
| 303 | set_table_entry(&table[12], "name", sd->name, | ||
| 304 | CORENAME_MAX_SIZE, 0444, proc_dostring, false); | ||
| 305 | /* &table[13] is terminator */ | 280 | /* &table[13] is terminator */ |
| 306 | 281 | ||
| 307 | return table; | 282 | return table; |
| @@ -332,8 +307,8 @@ static struct ctl_table *sd_alloc_ctl_cpu_table(int cpu) | |||
| 332 | return table; | 307 | return table; |
| 333 | } | 308 | } |
| 334 | 309 | ||
| 335 | static cpumask_var_t sd_sysctl_cpus; | 310 | static cpumask_var_t sd_sysctl_cpus; |
| 336 | static struct ctl_table_header *sd_sysctl_header; | 311 | static struct ctl_table_header *sd_sysctl_header; |
| 337 | 312 | ||
| 338 | void register_sched_domain_sysctl(void) | 313 | void register_sched_domain_sysctl(void) |
| 339 | { | 314 | { |
| @@ -413,14 +388,10 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_group | |||
| 413 | { | 388 | { |
| 414 | struct sched_entity *se = tg->se[cpu]; | 389 | struct sched_entity *se = tg->se[cpu]; |
| 415 | 390 | ||
| 416 | #define P(F) \ | 391 | #define P(F) SEQ_printf(m, " .%-30s: %lld\n", #F, (long long)F) |
| 417 | SEQ_printf(m, " .%-30s: %lld\n", #F, (long long)F) | 392 | #define P_SCHEDSTAT(F) SEQ_printf(m, " .%-30s: %lld\n", #F, (long long)schedstat_val(F)) |
| 418 | #define P_SCHEDSTAT(F) \ | 393 | #define PN(F) SEQ_printf(m, " .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)F)) |
| 419 | SEQ_printf(m, " .%-30s: %lld\n", #F, (long long)schedstat_val(F)) | 394 | #define PN_SCHEDSTAT(F) SEQ_printf(m, " .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)schedstat_val(F))) |
| 420 | #define PN(F) \ | ||
| 421 | SEQ_printf(m, " .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)F)) | ||
| 422 | #define PN_SCHEDSTAT(F) \ | ||
| 423 | SEQ_printf(m, " .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)schedstat_val(F))) | ||
| 424 | 395 | ||
| 425 | if (!se) | 396 | if (!se) |
| 426 | return; | 397 | return; |
| @@ -428,6 +399,7 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_group | |||
| 428 | PN(se->exec_start); | 399 | PN(se->exec_start); |
| 429 | PN(se->vruntime); | 400 | PN(se->vruntime); |
| 430 | PN(se->sum_exec_runtime); | 401 | PN(se->sum_exec_runtime); |
| 402 | |||
| 431 | if (schedstat_enabled()) { | 403 | if (schedstat_enabled()) { |
| 432 | PN_SCHEDSTAT(se->statistics.wait_start); | 404 | PN_SCHEDSTAT(se->statistics.wait_start); |
| 433 | PN_SCHEDSTAT(se->statistics.sleep_start); | 405 | PN_SCHEDSTAT(se->statistics.sleep_start); |
| @@ -440,6 +412,7 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_group | |||
| 440 | PN_SCHEDSTAT(se->statistics.wait_sum); | 412 | PN_SCHEDSTAT(se->statistics.wait_sum); |
| 441 | P_SCHEDSTAT(se->statistics.wait_count); | 413 | P_SCHEDSTAT(se->statistics.wait_count); |
| 442 | } | 414 | } |
| 415 | |||
| 443 | P(se->load.weight); | 416 | P(se->load.weight); |
| 444 | P(se->runnable_weight); | 417 | P(se->runnable_weight); |
| 445 | #ifdef CONFIG_SMP | 418 | #ifdef CONFIG_SMP |
| @@ -464,6 +437,7 @@ static char *task_group_path(struct task_group *tg) | |||
| 464 | return group_path; | 437 | return group_path; |
| 465 | 438 | ||
| 466 | cgroup_path(tg->css.cgroup, group_path, PATH_MAX); | 439 | cgroup_path(tg->css.cgroup, group_path, PATH_MAX); |
| 440 | |||
| 467 | return group_path; | 441 | return group_path; |
| 468 | } | 442 | } |
| 469 | #endif | 443 | #endif |
| @@ -569,6 +543,8 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | |||
| 569 | cfs_rq->avg.runnable_load_avg); | 543 | cfs_rq->avg.runnable_load_avg); |
| 570 | SEQ_printf(m, " .%-30s: %lu\n", "util_avg", | 544 | SEQ_printf(m, " .%-30s: %lu\n", "util_avg", |
| 571 | cfs_rq->avg.util_avg); | 545 | cfs_rq->avg.util_avg); |
| 546 | SEQ_printf(m, " .%-30s: %u\n", "util_est_enqueued", | ||
| 547 | cfs_rq->avg.util_est.enqueued); | ||
| 572 | SEQ_printf(m, " .%-30s: %ld\n", "removed.load_avg", | 548 | SEQ_printf(m, " .%-30s: %ld\n", "removed.load_avg", |
| 573 | cfs_rq->removed.load_avg); | 549 | cfs_rq->removed.load_avg); |
| 574 | SEQ_printf(m, " .%-30s: %ld\n", "removed.util_avg", | 550 | SEQ_printf(m, " .%-30s: %ld\n", "removed.util_avg", |
| @@ -804,9 +780,9 @@ void sysrq_sched_debug_show(void) | |||
| 804 | /* | 780 | /* |
| 805 | * This itererator needs some explanation. | 781 | * This itererator needs some explanation. |
| 806 | * It returns 1 for the header position. | 782 | * It returns 1 for the header position. |
| 807 | * This means 2 is cpu 0. | 783 | * This means 2 is CPU 0. |
| 808 | * In a hotplugged system some cpus, including cpu 0, may be missing so we have | 784 | * In a hotplugged system some CPUs, including CPU 0, may be missing so we have |
| 809 | * to use cpumask_* to iterate over the cpus. | 785 | * to use cpumask_* to iterate over the CPUs. |
| 810 | */ | 786 | */ |
| 811 | static void *sched_debug_start(struct seq_file *file, loff_t *offset) | 787 | static void *sched_debug_start(struct seq_file *file, loff_t *offset) |
| 812 | { | 788 | { |
| @@ -826,6 +802,7 @@ static void *sched_debug_start(struct seq_file *file, loff_t *offset) | |||
| 826 | 802 | ||
| 827 | if (n < nr_cpu_ids) | 803 | if (n < nr_cpu_ids) |
| 828 | return (void *)(unsigned long)(n + 2); | 804 | return (void *)(unsigned long)(n + 2); |
| 805 | |||
| 829 | return NULL; | 806 | return NULL; |
| 830 | } | 807 | } |
| 831 | 808 | ||
| @@ -840,10 +817,10 @@ static void sched_debug_stop(struct seq_file *file, void *data) | |||
| 840 | } | 817 | } |
| 841 | 818 | ||
| 842 | static const struct seq_operations sched_debug_sops = { | 819 | static const struct seq_operations sched_debug_sops = { |
| 843 | .start = sched_debug_start, | 820 | .start = sched_debug_start, |
| 844 | .next = sched_debug_next, | 821 | .next = sched_debug_next, |
| 845 | .stop = sched_debug_stop, | 822 | .stop = sched_debug_stop, |
| 846 | .show = sched_debug_show, | 823 | .show = sched_debug_show, |
| 847 | }; | 824 | }; |
| 848 | 825 | ||
| 849 | static int sched_debug_release(struct inode *inode, struct file *file) | 826 | static int sched_debug_release(struct inode *inode, struct file *file) |
| @@ -881,14 +858,10 @@ static int __init init_sched_debug_procfs(void) | |||
| 881 | 858 | ||
| 882 | __initcall(init_sched_debug_procfs); | 859 | __initcall(init_sched_debug_procfs); |
| 883 | 860 | ||
| 884 | #define __P(F) \ | 861 | #define __P(F) SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F) |
| 885 | SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F) | 862 | #define P(F) SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F) |
| 886 | #define P(F) \ | 863 | #define __PN(F) SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F)) |
| 887 | SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F) | 864 | #define PN(F) SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F)) |
| 888 | #define __PN(F) \ | ||
| 889 | SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F)) | ||
| 890 | #define PN(F) \ | ||
| 891 | SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F)) | ||
| 892 | 865 | ||
| 893 | 866 | ||
| 894 | #ifdef CONFIG_NUMA_BALANCING | 867 | #ifdef CONFIG_NUMA_BALANCING |
| @@ -1023,6 +996,8 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, | |||
| 1023 | P(se.avg.runnable_load_avg); | 996 | P(se.avg.runnable_load_avg); |
| 1024 | P(se.avg.util_avg); | 997 | P(se.avg.util_avg); |
| 1025 | P(se.avg.last_update_time); | 998 | P(se.avg.last_update_time); |
| 999 | P(se.avg.util_est.ewma); | ||
| 1000 | P(se.avg.util_est.enqueued); | ||
| 1026 | #endif | 1001 | #endif |
| 1027 | P(policy); | 1002 | P(policy); |
| 1028 | P(prio); | 1003 | P(prio); |
