Pull bugzilla-9345 into release branch
[sfrench/cifs-2.6.git] / kernel / sched_debug.c
index 3e47e870b043e99f9bb6726bb85befaabfeb88c1..d30467b47ddd0cd681f6da0afbe9c96c8b52df93 100644 (file)
@@ -80,6 +80,7 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
 static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
 {
        struct task_struct *g, *p;
+       unsigned long flags;
 
        SEQ_printf(m,
        "\nrunnable tasks:\n"
@@ -88,7 +89,7 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
        "------------------------------------------------------"
        "----------------------------------------------------\n");
 
-       read_lock_irq(&tasklist_lock);
+       read_lock_irqsave(&tasklist_lock, flags);
 
        do_each_thread(g, p) {
                if (!p->se.on_rq || task_cpu(p) != rq_cpu)
@@ -97,7 +98,7 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
                print_task(m, rq, p);
        } while_each_thread(g, p);
 
-       read_unlock_irq(&tasklist_lock);
+       read_unlock_irqrestore(&tasklist_lock, flags);
 }
 
 void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
@@ -136,6 +137,12 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
                        SPLIT_NS(spread0));
        SEQ_printf(m, "  .%-30s: %ld\n", "nr_running", cfs_rq->nr_running);
        SEQ_printf(m, "  .%-30s: %ld\n", "load", cfs_rq->load.weight);
+#ifdef CONFIG_SCHEDSTATS
+       SEQ_printf(m, "  .%-30s: %d\n", "bkl_count",
+                       rq->bkl_count);
+#endif
+       SEQ_printf(m, "  .%-30s: %ld\n", "nr_spread_over",
+                       cfs_rq->nr_spread_over);
 }
 
 static void print_cpu(struct seq_file *m, int cpu)
@@ -192,13 +199,26 @@ static int sched_debug_show(struct seq_file *m, void *v)
        u64 now = ktime_to_ns(ktime_get());
        int cpu;
 
-       SEQ_printf(m, "Sched Debug Version: v0.05-v20, %s %.*s\n",
+       SEQ_printf(m, "Sched Debug Version: v0.07, %s %.*s\n",
                init_utsname()->release,
                (int)strcspn(init_utsname()->version, " "),
                init_utsname()->version);
 
        SEQ_printf(m, "now at %Lu.%06ld msecs\n", SPLIT_NS(now));
 
+#define P(x) \
+       SEQ_printf(m, "  .%-40s: %Ld\n", #x, (long long)(x))
+#define PN(x) \
+       SEQ_printf(m, "  .%-40s: %Ld.%06ld\n", #x, SPLIT_NS(x))
+       PN(sysctl_sched_latency);
+       PN(sysctl_sched_min_granularity);
+       PN(sysctl_sched_wakeup_granularity);
+       PN(sysctl_sched_batch_wakeup_granularity);
+       PN(sysctl_sched_child_runs_first);
+       P(sysctl_sched_features);
+#undef PN
+#undef P
+
        for_each_online_cpu(cpu)
                print_cpu(m, cpu);
 
@@ -217,7 +237,7 @@ static int sched_debug_open(struct inode *inode, struct file *filp)
        return single_open(filp, sched_debug_show, NULL);
 }
 
-static struct file_operations sched_debug_fops = {
+static const struct file_operations sched_debug_fops = {
        .open           = sched_debug_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -241,6 +261,7 @@ __initcall(init_sched_debug_procfs);
 
 void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
 {
+       unsigned long nr_switches;
        unsigned long flags;
        int num_threads = 1;
 
@@ -252,16 +273,23 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
        rcu_read_unlock();
 
        SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm, p->pid, num_threads);
-       SEQ_printf(m, "----------------------------------------------\n");
+       SEQ_printf(m,
+               "---------------------------------------------------------\n");
+#define __P(F) \
+       SEQ_printf(m, "%-35s:%21Ld\n", #F, (long long)F)
 #define P(F) \
-       SEQ_printf(m, "%-25s:%20Ld\n", #F, (long long)p->F)
+       SEQ_printf(m, "%-35s:%21Ld\n", #F, (long long)p->F)
+#define __PN(F) \
+       SEQ_printf(m, "%-35s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F))
 #define PN(F) \
-       SEQ_printf(m, "%-25s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F))
+       SEQ_printf(m, "%-35s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F))
 
        PN(se.exec_start);
        PN(se.vruntime);
        PN(se.sum_exec_runtime);
 
+       nr_switches = p->nvcsw + p->nivcsw;
+
 #ifdef CONFIG_SCHEDSTATS
        PN(se.wait_start);
        PN(se.sleep_start);
@@ -271,21 +299,65 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
        PN(se.exec_max);
        PN(se.slice_max);
        PN(se.wait_max);
+       P(sched_info.bkl_count);
+       P(se.nr_migrations);
+       P(se.nr_migrations_cold);
+       P(se.nr_failed_migrations_affine);
+       P(se.nr_failed_migrations_running);
+       P(se.nr_failed_migrations_hot);
+       P(se.nr_forced_migrations);
+       P(se.nr_forced2_migrations);
+       P(se.nr_wakeups);
+       P(se.nr_wakeups_sync);
+       P(se.nr_wakeups_migrate);
+       P(se.nr_wakeups_local);
+       P(se.nr_wakeups_remote);
+       P(se.nr_wakeups_affine);
+       P(se.nr_wakeups_affine_attempts);
+       P(se.nr_wakeups_passive);
+       P(se.nr_wakeups_idle);
+
+       {
+               u64 avg_atom, avg_per_cpu;
+
+               avg_atom = p->se.sum_exec_runtime;
+               if (nr_switches)
+                       do_div(avg_atom, nr_switches);
+               else
+                       avg_atom = -1LL;
+
+               avg_per_cpu = p->se.sum_exec_runtime;
+               if (p->se.nr_migrations) {
+                       avg_per_cpu = div64_64(avg_per_cpu,
+                                              p->se.nr_migrations);
+               } else {
+                       avg_per_cpu = -1LL;
+               }
+
+               __PN(avg_atom);
+               __PN(avg_per_cpu);
+       }
 #endif
-       SEQ_printf(m, "%-25s:%20Ld\n",
-                  "nr_switches", (long long)(p->nvcsw + p->nivcsw));
+       __P(nr_switches);
+       SEQ_printf(m, "%-35s:%21Ld\n",
+                  "nr_voluntary_switches", (long long)p->nvcsw);
+       SEQ_printf(m, "%-35s:%21Ld\n",
+                  "nr_involuntary_switches", (long long)p->nivcsw);
+
        P(se.load.weight);
        P(policy);
        P(prio);
-#undef P
 #undef PN
+#undef __PN
+#undef P
+#undef __P
 
        {
                u64 t0, t1;
 
                t0 = sched_clock();
                t1 = sched_clock();
-               SEQ_printf(m, "%-25s:%20Ld\n",
+               SEQ_printf(m, "%-35s:%21Ld\n",
                           "clock-delta", (long long)(t1-t0));
        }
 }
@@ -293,12 +365,32 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
 void proc_sched_set_task(struct task_struct *p)
 {
 #ifdef CONFIG_SCHEDSTATS
-       p->se.sleep_max                 = 0;
-       p->se.block_max                 = 0;
-       p->se.exec_max                  = 0;
-       p->se.slice_max                 = 0;
-       p->se.wait_max                  = 0;
+       p->se.wait_max                          = 0;
+       p->se.sleep_max                         = 0;
+       p->se.sum_sleep_runtime                 = 0;
+       p->se.block_max                         = 0;
+       p->se.exec_max                          = 0;
+       p->se.slice_max                         = 0;
+       p->se.nr_migrations                     = 0;
+       p->se.nr_migrations_cold                = 0;
+       p->se.nr_failed_migrations_affine       = 0;
+       p->se.nr_failed_migrations_running      = 0;
+       p->se.nr_failed_migrations_hot          = 0;
+       p->se.nr_forced_migrations              = 0;
+       p->se.nr_forced2_migrations             = 0;
+       p->se.nr_wakeups                        = 0;
+       p->se.nr_wakeups_sync                   = 0;
+       p->se.nr_wakeups_migrate                = 0;
+       p->se.nr_wakeups_local                  = 0;
+       p->se.nr_wakeups_remote                 = 0;
+       p->se.nr_wakeups_affine                 = 0;
+       p->se.nr_wakeups_affine_attempts        = 0;
+       p->se.nr_wakeups_passive                = 0;
+       p->se.nr_wakeups_idle                   = 0;
+       p->sched_info.bkl_count                 = 0;
 #endif
-       p->se.sum_exec_runtime          = 0;
-       p->se.prev_sum_exec_runtime     = 0;
+       p->se.sum_exec_runtime                  = 0;
+       p->se.prev_sum_exec_runtime             = 0;
+       p->nvcsw                                = 0;
+       p->nivcsw                               = 0;
 }