aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/debug.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2013-10-07 06:29:30 -0400
committerIngo Molnar <mingo@kernel.org>2013-10-09 08:48:04 -0400
commitb32e86b4301e345611f0446265f782a229faadf6 (patch)
tree8cc0a8b731e63f2b3450f89330d49009374c99fb /kernel/sched/debug.c
parent7dbd13ed06513b047216a7ffc718bad9df0660f1 (diff)
sched/numa: Add debugging
Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Mel Gorman <mgorman@suse.de> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: http://lkml.kernel.org/r/1381141781-10992-53-git-send-email-mgorman@suse.de
Diffstat (limited to 'kernel/sched/debug.c')
-rw-r--r--kernel/sched/debug.c60
1 files changed, 58 insertions, 2 deletions
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 196559994f7c..e6ba5e31c7ca 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -15,6 +15,7 @@
15#include <linux/seq_file.h> 15#include <linux/seq_file.h>
16#include <linux/kallsyms.h> 16#include <linux/kallsyms.h>
17#include <linux/utsname.h> 17#include <linux/utsname.h>
18#include <linux/mempolicy.h>
18 19
19#include "sched.h" 20#include "sched.h"
20 21
@@ -137,6 +138,9 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
137 SEQ_printf(m, "%15Ld %15Ld %15Ld.%06ld %15Ld.%06ld %15Ld.%06ld", 138 SEQ_printf(m, "%15Ld %15Ld %15Ld.%06ld %15Ld.%06ld %15Ld.%06ld",
138 0LL, 0LL, 0LL, 0L, 0LL, 0L, 0LL, 0L); 139 0LL, 0LL, 0LL, 0L, 0LL, 0L, 0LL, 0L);
139#endif 140#endif
141#ifdef CONFIG_NUMA_BALANCING
142 SEQ_printf(m, " %d", cpu_to_node(task_cpu(p)));
143#endif
140#ifdef CONFIG_CGROUP_SCHED 144#ifdef CONFIG_CGROUP_SCHED
141 SEQ_printf(m, " %s", task_group_path(task_group(p))); 145 SEQ_printf(m, " %s", task_group_path(task_group(p)));
142#endif 146#endif
@@ -159,7 +163,7 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
159 read_lock_irqsave(&tasklist_lock, flags); 163 read_lock_irqsave(&tasklist_lock, flags);
160 164
161 do_each_thread(g, p) { 165 do_each_thread(g, p) {
162 if (!p->on_rq || task_cpu(p) != rq_cpu) 166 if (task_cpu(p) != rq_cpu)
163 continue; 167 continue;
164 168
165 print_task(m, rq, p); 169 print_task(m, rq, p);
@@ -345,7 +349,7 @@ static void sched_debug_header(struct seq_file *m)
345 cpu_clk = local_clock(); 349 cpu_clk = local_clock();
346 local_irq_restore(flags); 350 local_irq_restore(flags);
347 351
348 SEQ_printf(m, "Sched Debug Version: v0.10, %s %.*s\n", 352 SEQ_printf(m, "Sched Debug Version: v0.11, %s %.*s\n",
349 init_utsname()->release, 353 init_utsname()->release,
350 (int)strcspn(init_utsname()->version, " "), 354 (int)strcspn(init_utsname()->version, " "),
351 init_utsname()->version); 355 init_utsname()->version);
@@ -488,6 +492,56 @@ static int __init init_sched_debug_procfs(void)
488 492
489__initcall(init_sched_debug_procfs); 493__initcall(init_sched_debug_procfs);
490 494
495#define __P(F) \
496 SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F)
497#define P(F) \
498 SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F)
499#define __PN(F) \
500 SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F))
501#define PN(F) \
502 SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F))
503
504
505static void sched_show_numa(struct task_struct *p, struct seq_file *m)
506{
507#ifdef CONFIG_NUMA_BALANCING
508 struct mempolicy *pol;
509 int node, i;
510
511 if (p->mm)
512 P(mm->numa_scan_seq);
513
514 task_lock(p);
515 pol = p->mempolicy;
516 if (pol && !(pol->flags & MPOL_F_MORON))
517 pol = NULL;
518 mpol_get(pol);
519 task_unlock(p);
520
521 SEQ_printf(m, "numa_migrations, %ld\n", xchg(&p->numa_pages_migrated, 0));
522
523 for_each_online_node(node) {
524 for (i = 0; i < 2; i++) {
525 unsigned long nr_faults = -1;
526 int cpu_current, home_node;
527
528 if (p->numa_faults)
529 nr_faults = p->numa_faults[2*node + i];
530
531 cpu_current = !i ? (task_node(p) == node) :
532 (pol && node_isset(node, pol->v.nodes));
533
534 home_node = (p->numa_preferred_nid == node);
535
536 SEQ_printf(m, "numa_faults, %d, %d, %d, %d, %ld\n",
537 i, node, cpu_current, home_node, nr_faults);
538 }
539 }
540
541 mpol_put(pol);
542#endif
543}
544
491void proc_sched_show_task(struct task_struct *p, struct seq_file *m) 545void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
492{ 546{
493 unsigned long nr_switches; 547 unsigned long nr_switches;
@@ -591,6 +645,8 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
591 SEQ_printf(m, "%-45s:%21Ld\n", 645 SEQ_printf(m, "%-45s:%21Ld\n",
592 "clock-delta", (long long)(t1-t0)); 646 "clock-delta", (long long)(t1-t0));
593 } 647 }
648
649 sched_show_numa(p, m);
594} 650}
595 651
596void proc_sched_set_task(struct task_struct *p) 652void proc_sched_set_task(struct task_struct *p)