1391e43daSPeter Zijlstra /* 2391e43daSPeter Zijlstra * kernel/sched/debug.c 3391e43daSPeter Zijlstra * 4391e43daSPeter Zijlstra * Print the CFS rbtree 5391e43daSPeter Zijlstra * 6391e43daSPeter Zijlstra * Copyright(C) 2007, Red Hat, Inc., Ingo Molnar 7391e43daSPeter Zijlstra * 8391e43daSPeter Zijlstra * This program is free software; you can redistribute it and/or modify 9391e43daSPeter Zijlstra * it under the terms of the GNU General Public License version 2 as 10391e43daSPeter Zijlstra * published by the Free Software Foundation. 11391e43daSPeter Zijlstra */ 12391e43daSPeter Zijlstra 13391e43daSPeter Zijlstra #include <linux/proc_fs.h> 14589ee628SIngo Molnar #include <linux/sched/mm.h> 15f719ff9bSIngo Molnar #include <linux/sched/task.h> 16391e43daSPeter Zijlstra #include <linux/seq_file.h> 17391e43daSPeter Zijlstra #include <linux/kallsyms.h> 18391e43daSPeter Zijlstra #include <linux/utsname.h> 19b32e86b4SIngo Molnar #include <linux/mempolicy.h> 20d6ca41d7SSteven Rostedt (Red Hat) #include <linux/debugfs.h> 21391e43daSPeter Zijlstra 22391e43daSPeter Zijlstra #include "sched.h" 23391e43daSPeter Zijlstra 24391e43daSPeter Zijlstra static DEFINE_SPINLOCK(sched_debug_lock); 25391e43daSPeter Zijlstra 26391e43daSPeter Zijlstra /* 27391e43daSPeter Zijlstra * This allows printing both to /proc/sched_debug and 28391e43daSPeter Zijlstra * to the console 29391e43daSPeter Zijlstra */ 30391e43daSPeter Zijlstra #define SEQ_printf(m, x...) \ 31391e43daSPeter Zijlstra do { \ 32391e43daSPeter Zijlstra if (m) \ 33391e43daSPeter Zijlstra seq_printf(m, x); \ 34391e43daSPeter Zijlstra else \ 35391e43daSPeter Zijlstra printk(x); \ 36391e43daSPeter Zijlstra } while (0) 37391e43daSPeter Zijlstra 38391e43daSPeter Zijlstra /* 39391e43daSPeter Zijlstra * Ease the printing of nsec fields: 40391e43daSPeter Zijlstra */ 41391e43daSPeter Zijlstra static long long nsec_high(unsigned long long nsec) 42391e43daSPeter Zijlstra { 43391e43daSPeter Zijlstra if ((long long)nsec < 0) { 44391e43daSPeter Zijlstra nsec = -nsec; 45391e43daSPeter Zijlstra do_div(nsec, 1000000); 46391e43daSPeter Zijlstra return -nsec; 47391e43daSPeter Zijlstra } 48391e43daSPeter Zijlstra do_div(nsec, 1000000); 49391e43daSPeter Zijlstra 50391e43daSPeter Zijlstra return nsec; 51391e43daSPeter Zijlstra } 52391e43daSPeter Zijlstra 53391e43daSPeter Zijlstra static unsigned long nsec_low(unsigned long long nsec) 54391e43daSPeter Zijlstra { 55391e43daSPeter Zijlstra if ((long long)nsec < 0) 56391e43daSPeter Zijlstra nsec = -nsec; 57391e43daSPeter Zijlstra 58391e43daSPeter Zijlstra return do_div(nsec, 1000000); 59391e43daSPeter Zijlstra } 60391e43daSPeter Zijlstra 61391e43daSPeter Zijlstra #define SPLIT_NS(x) nsec_high(x), nsec_low(x) 62391e43daSPeter Zijlstra 63d6ca41d7SSteven Rostedt (Red Hat) #define SCHED_FEAT(name, enabled) \ 64d6ca41d7SSteven Rostedt (Red Hat) #name , 65d6ca41d7SSteven Rostedt (Red Hat) 66d6ca41d7SSteven Rostedt (Red Hat) static const char * const sched_feat_names[] = { 67d6ca41d7SSteven Rostedt (Red Hat) #include "features.h" 68d6ca41d7SSteven Rostedt (Red Hat) }; 69d6ca41d7SSteven Rostedt (Red Hat) 70d6ca41d7SSteven Rostedt (Red Hat) #undef SCHED_FEAT 71d6ca41d7SSteven Rostedt (Red Hat) 72d6ca41d7SSteven Rostedt (Red Hat) static int sched_feat_show(struct seq_file *m, void *v) 73d6ca41d7SSteven Rostedt (Red Hat) { 74d6ca41d7SSteven Rostedt (Red Hat) int i; 75d6ca41d7SSteven Rostedt (Red Hat) 76d6ca41d7SSteven Rostedt (Red Hat) for (i = 0; i < __SCHED_FEAT_NR; i++) { 77d6ca41d7SSteven Rostedt (Red Hat) if (!(sysctl_sched_features & (1UL << i))) 78d6ca41d7SSteven Rostedt (Red Hat) seq_puts(m, "NO_"); 79d6ca41d7SSteven Rostedt (Red Hat) seq_printf(m, "%s ", sched_feat_names[i]); 80d6ca41d7SSteven Rostedt (Red Hat) } 81d6ca41d7SSteven Rostedt (Red Hat) seq_puts(m, "\n"); 82d6ca41d7SSteven Rostedt (Red Hat) 83d6ca41d7SSteven Rostedt (Red Hat) return 0; 84d6ca41d7SSteven Rostedt (Red Hat) } 85d6ca41d7SSteven Rostedt (Red Hat) 86d6ca41d7SSteven Rostedt (Red Hat) #ifdef HAVE_JUMP_LABEL 87d6ca41d7SSteven Rostedt (Red Hat) 88d6ca41d7SSteven Rostedt (Red Hat) #define jump_label_key__true STATIC_KEY_INIT_TRUE 89d6ca41d7SSteven Rostedt (Red Hat) #define jump_label_key__false STATIC_KEY_INIT_FALSE 90d6ca41d7SSteven Rostedt (Red Hat) 91d6ca41d7SSteven Rostedt (Red Hat) #define SCHED_FEAT(name, enabled) \ 92d6ca41d7SSteven Rostedt (Red Hat) jump_label_key__##enabled , 93d6ca41d7SSteven Rostedt (Red Hat) 94d6ca41d7SSteven Rostedt (Red Hat) struct static_key sched_feat_keys[__SCHED_FEAT_NR] = { 95d6ca41d7SSteven Rostedt (Red Hat) #include "features.h" 96d6ca41d7SSteven Rostedt (Red Hat) }; 97d6ca41d7SSteven Rostedt (Red Hat) 98d6ca41d7SSteven Rostedt (Red Hat) #undef SCHED_FEAT 99d6ca41d7SSteven Rostedt (Red Hat) 100d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_disable(int i) 101d6ca41d7SSteven Rostedt (Red Hat) { 102d6ca41d7SSteven Rostedt (Red Hat) static_key_disable(&sched_feat_keys[i]); 103d6ca41d7SSteven Rostedt (Red Hat) } 104d6ca41d7SSteven Rostedt (Red Hat) 105d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_enable(int i) 106d6ca41d7SSteven Rostedt (Red Hat) { 107d6ca41d7SSteven Rostedt (Red Hat) static_key_enable(&sched_feat_keys[i]); 108d6ca41d7SSteven Rostedt (Red Hat) } 109d6ca41d7SSteven Rostedt (Red Hat) #else 110d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_disable(int i) { }; 111d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_enable(int i) { }; 112d6ca41d7SSteven Rostedt (Red Hat) #endif /* HAVE_JUMP_LABEL */ 113d6ca41d7SSteven Rostedt (Red Hat) 114d6ca41d7SSteven Rostedt (Red Hat) static int sched_feat_set(char *cmp) 115d6ca41d7SSteven Rostedt (Red Hat) { 116d6ca41d7SSteven Rostedt (Red Hat) int i; 117d6ca41d7SSteven Rostedt (Red Hat) int neg = 0; 118d6ca41d7SSteven Rostedt (Red Hat) 119d6ca41d7SSteven Rostedt (Red Hat) if (strncmp(cmp, "NO_", 3) == 0) { 120d6ca41d7SSteven Rostedt (Red Hat) neg = 1; 121d6ca41d7SSteven Rostedt (Red Hat) cmp += 3; 122d6ca41d7SSteven Rostedt (Red Hat) } 123d6ca41d7SSteven Rostedt (Red Hat) 124d6ca41d7SSteven Rostedt (Red Hat) for (i = 0; i < __SCHED_FEAT_NR; i++) { 125d6ca41d7SSteven Rostedt (Red Hat) if (strcmp(cmp, sched_feat_names[i]) == 0) { 126d6ca41d7SSteven Rostedt (Red Hat) if (neg) { 127d6ca41d7SSteven Rostedt (Red Hat) sysctl_sched_features &= ~(1UL << i); 128d6ca41d7SSteven Rostedt (Red Hat) sched_feat_disable(i); 129d6ca41d7SSteven Rostedt (Red Hat) } else { 130d6ca41d7SSteven Rostedt (Red Hat) sysctl_sched_features |= (1UL << i); 131d6ca41d7SSteven Rostedt (Red Hat) sched_feat_enable(i); 132d6ca41d7SSteven Rostedt (Red Hat) } 133d6ca41d7SSteven Rostedt (Red Hat) break; 134d6ca41d7SSteven Rostedt (Red Hat) } 135d6ca41d7SSteven Rostedt (Red Hat) } 136d6ca41d7SSteven Rostedt (Red Hat) 137d6ca41d7SSteven Rostedt (Red Hat) return i; 138d6ca41d7SSteven Rostedt (Red Hat) } 139d6ca41d7SSteven Rostedt (Red Hat) 140d6ca41d7SSteven Rostedt (Red Hat) static ssize_t 141d6ca41d7SSteven Rostedt (Red Hat) sched_feat_write(struct file *filp, const char __user *ubuf, 142d6ca41d7SSteven Rostedt (Red Hat) size_t cnt, loff_t *ppos) 143d6ca41d7SSteven Rostedt (Red Hat) { 144d6ca41d7SSteven Rostedt (Red Hat) char buf[64]; 145d6ca41d7SSteven Rostedt (Red Hat) char *cmp; 146d6ca41d7SSteven Rostedt (Red Hat) int i; 147d6ca41d7SSteven Rostedt (Red Hat) struct inode *inode; 148d6ca41d7SSteven Rostedt (Red Hat) 149d6ca41d7SSteven Rostedt (Red Hat) if (cnt > 63) 150d6ca41d7SSteven Rostedt (Red Hat) cnt = 63; 151d6ca41d7SSteven Rostedt (Red Hat) 152d6ca41d7SSteven Rostedt (Red Hat) if (copy_from_user(&buf, ubuf, cnt)) 153d6ca41d7SSteven Rostedt (Red Hat) return -EFAULT; 154d6ca41d7SSteven Rostedt (Red Hat) 155d6ca41d7SSteven Rostedt (Red Hat) buf[cnt] = 0; 156d6ca41d7SSteven Rostedt (Red Hat) cmp = strstrip(buf); 157d6ca41d7SSteven Rostedt (Red Hat) 158d6ca41d7SSteven Rostedt (Red Hat) /* Ensure the static_key remains in a consistent state */ 159d6ca41d7SSteven Rostedt (Red Hat) inode = file_inode(filp); 160d6ca41d7SSteven Rostedt (Red Hat) inode_lock(inode); 161d6ca41d7SSteven Rostedt (Red Hat) i = sched_feat_set(cmp); 162d6ca41d7SSteven Rostedt (Red Hat) inode_unlock(inode); 163d6ca41d7SSteven Rostedt (Red Hat) if (i == __SCHED_FEAT_NR) 164d6ca41d7SSteven Rostedt (Red Hat) return -EINVAL; 165d6ca41d7SSteven Rostedt (Red Hat) 166d6ca41d7SSteven Rostedt (Red Hat) *ppos += cnt; 167d6ca41d7SSteven Rostedt (Red Hat) 168d6ca41d7SSteven Rostedt (Red Hat) return cnt; 169d6ca41d7SSteven Rostedt (Red Hat) } 170d6ca41d7SSteven Rostedt (Red Hat) 171d6ca41d7SSteven Rostedt (Red Hat) static int sched_feat_open(struct inode *inode, struct file *filp) 172d6ca41d7SSteven Rostedt (Red Hat) { 173d6ca41d7SSteven Rostedt (Red Hat) return single_open(filp, sched_feat_show, NULL); 174d6ca41d7SSteven Rostedt (Red Hat) } 175d6ca41d7SSteven Rostedt (Red Hat) 176d6ca41d7SSteven Rostedt (Red Hat) static const struct file_operations sched_feat_fops = { 177d6ca41d7SSteven Rostedt (Red Hat) .open = sched_feat_open, 178d6ca41d7SSteven Rostedt (Red Hat) .write = sched_feat_write, 179d6ca41d7SSteven Rostedt (Red Hat) .read = seq_read, 180d6ca41d7SSteven Rostedt (Red Hat) .llseek = seq_lseek, 181d6ca41d7SSteven Rostedt (Red Hat) .release = single_release, 182d6ca41d7SSteven Rostedt (Red Hat) }; 183d6ca41d7SSteven Rostedt (Red Hat) 184d6ca41d7SSteven Rostedt (Red Hat) static __init int sched_init_debug(void) 185d6ca41d7SSteven Rostedt (Red Hat) { 186d6ca41d7SSteven Rostedt (Red Hat) debugfs_create_file("sched_features", 0644, NULL, NULL, 187d6ca41d7SSteven Rostedt (Red Hat) &sched_feat_fops); 188d6ca41d7SSteven Rostedt (Red Hat) 189d6ca41d7SSteven Rostedt (Red Hat) return 0; 190d6ca41d7SSteven Rostedt (Red Hat) } 191d6ca41d7SSteven Rostedt (Red Hat) late_initcall(sched_init_debug); 192d6ca41d7SSteven Rostedt (Red Hat) 1933866e845SSteven Rostedt (Red Hat) #ifdef CONFIG_SMP 1943866e845SSteven Rostedt (Red Hat) 1953866e845SSteven Rostedt (Red Hat) #ifdef CONFIG_SYSCTL 1963866e845SSteven Rostedt (Red Hat) 1973866e845SSteven Rostedt (Red Hat) static struct ctl_table sd_ctl_dir[] = { 1983866e845SSteven Rostedt (Red Hat) { 1993866e845SSteven Rostedt (Red Hat) .procname = "sched_domain", 2003866e845SSteven Rostedt (Red Hat) .mode = 0555, 2013866e845SSteven Rostedt (Red Hat) }, 2023866e845SSteven Rostedt (Red Hat) {} 2033866e845SSteven Rostedt (Red Hat) }; 2043866e845SSteven Rostedt (Red Hat) 2053866e845SSteven Rostedt (Red Hat) static struct ctl_table sd_ctl_root[] = { 2063866e845SSteven Rostedt (Red Hat) { 2073866e845SSteven Rostedt (Red Hat) .procname = "kernel", 2083866e845SSteven Rostedt (Red Hat) .mode = 0555, 2093866e845SSteven Rostedt (Red Hat) .child = sd_ctl_dir, 2103866e845SSteven Rostedt (Red Hat) }, 2113866e845SSteven Rostedt (Red Hat) {} 2123866e845SSteven Rostedt (Red Hat) }; 2133866e845SSteven Rostedt (Red Hat) 2143866e845SSteven Rostedt (Red Hat) static struct ctl_table *sd_alloc_ctl_entry(int n) 2153866e845SSteven Rostedt (Red Hat) { 2163866e845SSteven Rostedt (Red Hat) struct ctl_table *entry = 2173866e845SSteven Rostedt (Red Hat) kcalloc(n, sizeof(struct ctl_table), GFP_KERNEL); 2183866e845SSteven Rostedt (Red Hat) 2193866e845SSteven Rostedt (Red Hat) return entry; 2203866e845SSteven Rostedt (Red Hat) } 2213866e845SSteven Rostedt (Red Hat) 2223866e845SSteven Rostedt (Red Hat) static void sd_free_ctl_entry(struct ctl_table **tablep) 2233866e845SSteven Rostedt (Red Hat) { 2243866e845SSteven Rostedt (Red Hat) struct ctl_table *entry; 2253866e845SSteven Rostedt (Red Hat) 2263866e845SSteven Rostedt (Red Hat) /* 2273866e845SSteven Rostedt (Red Hat) * In the intermediate directories, both the child directory and 2283866e845SSteven Rostedt (Red Hat) * procname are dynamically allocated and could fail but the mode 2293866e845SSteven Rostedt (Red Hat) * will always be set. In the lowest directory the names are 2303866e845SSteven Rostedt (Red Hat) * static strings and all have proc handlers. 2313866e845SSteven Rostedt (Red Hat) */ 2323866e845SSteven Rostedt (Red Hat) for (entry = *tablep; entry->mode; entry++) { 2333866e845SSteven Rostedt (Red Hat) if (entry->child) 2343866e845SSteven Rostedt (Red Hat) sd_free_ctl_entry(&entry->child); 2353866e845SSteven Rostedt (Red Hat) if (entry->proc_handler == NULL) 2363866e845SSteven Rostedt (Red Hat) kfree(entry->procname); 2373866e845SSteven Rostedt (Red Hat) } 2383866e845SSteven Rostedt (Red Hat) 2393866e845SSteven Rostedt (Red Hat) kfree(*tablep); 2403866e845SSteven Rostedt (Red Hat) *tablep = NULL; 2413866e845SSteven Rostedt (Red Hat) } 2423866e845SSteven Rostedt (Red Hat) 2433866e845SSteven Rostedt (Red Hat) static int min_load_idx = 0; 2443866e845SSteven Rostedt (Red Hat) static int max_load_idx = CPU_LOAD_IDX_MAX-1; 2453866e845SSteven Rostedt (Red Hat) 2463866e845SSteven Rostedt (Red Hat) static void 2473866e845SSteven Rostedt (Red Hat) set_table_entry(struct ctl_table *entry, 2483866e845SSteven Rostedt (Red Hat) const char *procname, void *data, int maxlen, 2493866e845SSteven Rostedt (Red Hat) umode_t mode, proc_handler *proc_handler, 2503866e845SSteven Rostedt (Red Hat) bool load_idx) 2513866e845SSteven Rostedt (Red Hat) { 2523866e845SSteven Rostedt (Red Hat) entry->procname = procname; 2533866e845SSteven Rostedt (Red Hat) entry->data = data; 2543866e845SSteven Rostedt (Red Hat) entry->maxlen = maxlen; 2553866e845SSteven Rostedt (Red Hat) entry->mode = mode; 2563866e845SSteven Rostedt (Red Hat) entry->proc_handler = proc_handler; 2573866e845SSteven Rostedt (Red Hat) 2583866e845SSteven Rostedt (Red Hat) if (load_idx) { 2593866e845SSteven Rostedt (Red Hat) entry->extra1 = &min_load_idx; 2603866e845SSteven Rostedt (Red Hat) entry->extra2 = &max_load_idx; 2613866e845SSteven Rostedt (Red Hat) } 2623866e845SSteven Rostedt (Red Hat) } 2633866e845SSteven Rostedt (Red Hat) 2643866e845SSteven Rostedt (Red Hat) static struct ctl_table * 2653866e845SSteven Rostedt (Red Hat) sd_alloc_ctl_domain_table(struct sched_domain *sd) 2663866e845SSteven Rostedt (Red Hat) { 2673866e845SSteven Rostedt (Red Hat) struct ctl_table *table = sd_alloc_ctl_entry(14); 2683866e845SSteven Rostedt (Red Hat) 2693866e845SSteven Rostedt (Red Hat) if (table == NULL) 2703866e845SSteven Rostedt (Red Hat) return NULL; 2713866e845SSteven Rostedt (Red Hat) 2723866e845SSteven Rostedt (Red Hat) set_table_entry(&table[0], "min_interval", &sd->min_interval, 2733866e845SSteven Rostedt (Red Hat) sizeof(long), 0644, proc_doulongvec_minmax, false); 2743866e845SSteven Rostedt (Red Hat) set_table_entry(&table[1], "max_interval", &sd->max_interval, 2753866e845SSteven Rostedt (Red Hat) sizeof(long), 0644, proc_doulongvec_minmax, false); 2763866e845SSteven Rostedt (Red Hat) set_table_entry(&table[2], "busy_idx", &sd->busy_idx, 2773866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, true); 2783866e845SSteven Rostedt (Red Hat) set_table_entry(&table[3], "idle_idx", &sd->idle_idx, 2793866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, true); 2803866e845SSteven Rostedt (Red Hat) set_table_entry(&table[4], "newidle_idx", &sd->newidle_idx, 2813866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, true); 2823866e845SSteven Rostedt (Red Hat) set_table_entry(&table[5], "wake_idx", &sd->wake_idx, 2833866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, true); 2843866e845SSteven Rostedt (Red Hat) set_table_entry(&table[6], "forkexec_idx", &sd->forkexec_idx, 2853866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, true); 2863866e845SSteven Rostedt (Red Hat) set_table_entry(&table[7], "busy_factor", &sd->busy_factor, 2873866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, false); 2883866e845SSteven Rostedt (Red Hat) set_table_entry(&table[8], "imbalance_pct", &sd->imbalance_pct, 2893866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, false); 2903866e845SSteven Rostedt (Red Hat) set_table_entry(&table[9], "cache_nice_tries", 2913866e845SSteven Rostedt (Red Hat) &sd->cache_nice_tries, 2923866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, false); 2933866e845SSteven Rostedt (Red Hat) set_table_entry(&table[10], "flags", &sd->flags, 2943866e845SSteven Rostedt (Red Hat) sizeof(int), 0644, proc_dointvec_minmax, false); 2953866e845SSteven Rostedt (Red Hat) set_table_entry(&table[11], "max_newidle_lb_cost", 2963866e845SSteven Rostedt (Red Hat) &sd->max_newidle_lb_cost, 2973866e845SSteven Rostedt (Red Hat) sizeof(long), 0644, proc_doulongvec_minmax, false); 2983866e845SSteven Rostedt (Red Hat) set_table_entry(&table[12], "name", sd->name, 2993866e845SSteven Rostedt (Red Hat) CORENAME_MAX_SIZE, 0444, proc_dostring, false); 3003866e845SSteven Rostedt (Red Hat) /* &table[13] is terminator */ 3013866e845SSteven Rostedt (Red Hat) 3023866e845SSteven Rostedt (Red Hat) return table; 3033866e845SSteven Rostedt (Red Hat) } 3043866e845SSteven Rostedt (Red Hat) 3053866e845SSteven Rostedt (Red Hat) static struct ctl_table *sd_alloc_ctl_cpu_table(int cpu) 3063866e845SSteven Rostedt (Red Hat) { 3073866e845SSteven Rostedt (Red Hat) struct ctl_table *entry, *table; 3083866e845SSteven Rostedt (Red Hat) struct sched_domain *sd; 3093866e845SSteven Rostedt (Red Hat) int domain_num = 0, i; 3103866e845SSteven Rostedt (Red Hat) char buf[32]; 3113866e845SSteven Rostedt (Red Hat) 3123866e845SSteven Rostedt (Red Hat) for_each_domain(cpu, sd) 3133866e845SSteven Rostedt (Red Hat) domain_num++; 3143866e845SSteven Rostedt (Red Hat) entry = table = sd_alloc_ctl_entry(domain_num + 1); 3153866e845SSteven Rostedt (Red Hat) if (table == NULL) 3163866e845SSteven Rostedt (Red Hat) return NULL; 3173866e845SSteven Rostedt (Red Hat) 3183866e845SSteven Rostedt (Red Hat) i = 0; 3193866e845SSteven Rostedt (Red Hat) for_each_domain(cpu, sd) { 3203866e845SSteven Rostedt (Red Hat) snprintf(buf, 32, "domain%d", i); 3213866e845SSteven Rostedt (Red Hat) entry->procname = kstrdup(buf, GFP_KERNEL); 3223866e845SSteven Rostedt (Red Hat) entry->mode = 0555; 3233866e845SSteven Rostedt (Red Hat) entry->child = sd_alloc_ctl_domain_table(sd); 3243866e845SSteven Rostedt (Red Hat) entry++; 3253866e845SSteven Rostedt (Red Hat) i++; 3263866e845SSteven Rostedt (Red Hat) } 3273866e845SSteven Rostedt (Red Hat) return table; 3283866e845SSteven Rostedt (Red Hat) } 3293866e845SSteven Rostedt (Red Hat) 330*bbdacdfeSPeter Zijlstra static cpumask_var_t sd_sysctl_cpus; 3313866e845SSteven Rostedt (Red Hat) static struct ctl_table_header *sd_sysctl_header; 332*bbdacdfeSPeter Zijlstra 3333866e845SSteven Rostedt (Red Hat) void register_sched_domain_sysctl(void) 3343866e845SSteven Rostedt (Red Hat) { 335*bbdacdfeSPeter Zijlstra static struct ctl_table *cpu_entries; 336*bbdacdfeSPeter Zijlstra static struct ctl_table **cpu_idx; 3373866e845SSteven Rostedt (Red Hat) char buf[32]; 338*bbdacdfeSPeter Zijlstra int i; 3393866e845SSteven Rostedt (Red Hat) 340*bbdacdfeSPeter Zijlstra if (!cpu_entries) { 341*bbdacdfeSPeter Zijlstra cpu_entries = sd_alloc_ctl_entry(num_possible_cpus() + 1); 342*bbdacdfeSPeter Zijlstra if (!cpu_entries) 3433866e845SSteven Rostedt (Red Hat) return; 3443866e845SSteven Rostedt (Red Hat) 345*bbdacdfeSPeter Zijlstra WARN_ON(sd_ctl_dir[0].child); 346*bbdacdfeSPeter Zijlstra sd_ctl_dir[0].child = cpu_entries; 347*bbdacdfeSPeter Zijlstra } 348*bbdacdfeSPeter Zijlstra 349*bbdacdfeSPeter Zijlstra if (!cpu_idx) { 350*bbdacdfeSPeter Zijlstra struct ctl_table *e = cpu_entries; 351*bbdacdfeSPeter Zijlstra 352*bbdacdfeSPeter Zijlstra cpu_idx = kcalloc(nr_cpu_ids, sizeof(struct ctl_table*), GFP_KERNEL); 353*bbdacdfeSPeter Zijlstra if (!cpu_idx) 354*bbdacdfeSPeter Zijlstra return; 355*bbdacdfeSPeter Zijlstra 356*bbdacdfeSPeter Zijlstra /* deal with sparse possible map */ 3573866e845SSteven Rostedt (Red Hat) for_each_possible_cpu(i) { 358*bbdacdfeSPeter Zijlstra cpu_idx[i] = e; 359*bbdacdfeSPeter Zijlstra e++; 360*bbdacdfeSPeter Zijlstra } 361*bbdacdfeSPeter Zijlstra } 362*bbdacdfeSPeter Zijlstra 363*bbdacdfeSPeter Zijlstra if (!cpumask_available(sd_sysctl_cpus)) { 364*bbdacdfeSPeter Zijlstra if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL)) 365*bbdacdfeSPeter Zijlstra return; 366*bbdacdfeSPeter Zijlstra 367*bbdacdfeSPeter Zijlstra /* init to possible to not have holes in @cpu_entries */ 368*bbdacdfeSPeter Zijlstra cpumask_copy(sd_sysctl_cpus, cpu_possible_mask); 369*bbdacdfeSPeter Zijlstra } 370*bbdacdfeSPeter Zijlstra 371*bbdacdfeSPeter Zijlstra for_each_cpu(i, sd_sysctl_cpus) { 372*bbdacdfeSPeter Zijlstra struct ctl_table *e = cpu_idx[i]; 373*bbdacdfeSPeter Zijlstra 374*bbdacdfeSPeter Zijlstra if (e->child) 375*bbdacdfeSPeter Zijlstra sd_free_ctl_entry(&e->child); 376*bbdacdfeSPeter Zijlstra 377*bbdacdfeSPeter Zijlstra if (!e->procname) { 3783866e845SSteven Rostedt (Red Hat) snprintf(buf, 32, "cpu%d", i); 379*bbdacdfeSPeter Zijlstra e->procname = kstrdup(buf, GFP_KERNEL); 380*bbdacdfeSPeter Zijlstra } 381*bbdacdfeSPeter Zijlstra e->mode = 0555; 382*bbdacdfeSPeter Zijlstra e->child = sd_alloc_ctl_cpu_table(i); 383*bbdacdfeSPeter Zijlstra 384*bbdacdfeSPeter Zijlstra __cpumask_clear_cpu(i, sd_sysctl_cpus); 3853866e845SSteven Rostedt (Red Hat) } 3863866e845SSteven Rostedt (Red Hat) 3873866e845SSteven Rostedt (Red Hat) WARN_ON(sd_sysctl_header); 3883866e845SSteven Rostedt (Red Hat) sd_sysctl_header = register_sysctl_table(sd_ctl_root); 3893866e845SSteven Rostedt (Red Hat) } 3903866e845SSteven Rostedt (Red Hat) 391*bbdacdfeSPeter Zijlstra void dirty_sched_domain_sysctl(int cpu) 392*bbdacdfeSPeter Zijlstra { 393*bbdacdfeSPeter Zijlstra if (cpumask_available(sd_sysctl_cpus)) 394*bbdacdfeSPeter Zijlstra __cpumask_set_cpu(cpu, sd_sysctl_cpus); 395*bbdacdfeSPeter Zijlstra } 396*bbdacdfeSPeter Zijlstra 3973866e845SSteven Rostedt (Red Hat) /* may be called multiple times per register */ 3983866e845SSteven Rostedt (Red Hat) void unregister_sched_domain_sysctl(void) 3993866e845SSteven Rostedt (Red Hat) { 4003866e845SSteven Rostedt (Red Hat) unregister_sysctl_table(sd_sysctl_header); 4013866e845SSteven Rostedt (Red Hat) sd_sysctl_header = NULL; 4023866e845SSteven Rostedt (Red Hat) } 4033866e845SSteven Rostedt (Red Hat) #endif /* CONFIG_SYSCTL */ 4043866e845SSteven Rostedt (Red Hat) #endif /* CONFIG_SMP */ 4053866e845SSteven Rostedt (Red Hat) 406391e43daSPeter Zijlstra #ifdef CONFIG_FAIR_GROUP_SCHED 407391e43daSPeter Zijlstra static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_group *tg) 408391e43daSPeter Zijlstra { 409391e43daSPeter Zijlstra struct sched_entity *se = tg->se[cpu]; 410391e43daSPeter Zijlstra 411391e43daSPeter Zijlstra #define P(F) \ 412391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %lld\n", #F, (long long)F) 4134fa8d299SJosh Poimboeuf #define P_SCHEDSTAT(F) \ 4144fa8d299SJosh Poimboeuf SEQ_printf(m, " .%-30s: %lld\n", #F, (long long)schedstat_val(F)) 415391e43daSPeter Zijlstra #define PN(F) \ 416391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)F)) 4174fa8d299SJosh Poimboeuf #define PN_SCHEDSTAT(F) \ 4184fa8d299SJosh Poimboeuf SEQ_printf(m, " .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)schedstat_val(F))) 419391e43daSPeter Zijlstra 420cd126afeSYuyang Du if (!se) 42118bf2805SBen Segall return; 42218bf2805SBen Segall 423391e43daSPeter Zijlstra PN(se->exec_start); 424391e43daSPeter Zijlstra PN(se->vruntime); 425391e43daSPeter Zijlstra PN(se->sum_exec_runtime); 426cb251765SMel Gorman if (schedstat_enabled()) { 4274fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.wait_start); 4284fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.sleep_start); 4294fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.block_start); 4304fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.sleep_max); 4314fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.block_max); 4324fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.exec_max); 4334fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.slice_max); 4344fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.wait_max); 4354fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se->statistics.wait_sum); 4364fa8d299SJosh Poimboeuf P_SCHEDSTAT(se->statistics.wait_count); 437cb251765SMel Gorman } 438391e43daSPeter Zijlstra P(se->load.weight); 4399d85f21cSPaul Turner #ifdef CONFIG_SMP 4409d89c257SYuyang Du P(se->avg.load_avg); 4419d89c257SYuyang Du P(se->avg.util_avg); 4429d85f21cSPaul Turner #endif 4434fa8d299SJosh Poimboeuf 4444fa8d299SJosh Poimboeuf #undef PN_SCHEDSTAT 445391e43daSPeter Zijlstra #undef PN 4464fa8d299SJosh Poimboeuf #undef P_SCHEDSTAT 447391e43daSPeter Zijlstra #undef P 448391e43daSPeter Zijlstra } 449391e43daSPeter Zijlstra #endif 450391e43daSPeter Zijlstra 451391e43daSPeter Zijlstra #ifdef CONFIG_CGROUP_SCHED 452391e43daSPeter Zijlstra static char group_path[PATH_MAX]; 453391e43daSPeter Zijlstra 454391e43daSPeter Zijlstra static char *task_group_path(struct task_group *tg) 455391e43daSPeter Zijlstra { 456391e43daSPeter Zijlstra if (autogroup_path(tg, group_path, PATH_MAX)) 457391e43daSPeter Zijlstra return group_path; 458391e43daSPeter Zijlstra 4594c737b41STejun Heo cgroup_path(tg->css.cgroup, group_path, PATH_MAX); 4604c737b41STejun Heo return group_path; 461391e43daSPeter Zijlstra } 462391e43daSPeter Zijlstra #endif 463391e43daSPeter Zijlstra 464e8c16495SXie XiuQi static const char stat_nam[] = TASK_STATE_TO_CHAR_STR; 465e8c16495SXie XiuQi 466391e43daSPeter Zijlstra static void 467391e43daSPeter Zijlstra print_task(struct seq_file *m, struct rq *rq, struct task_struct *p) 468391e43daSPeter Zijlstra { 46920435d84SXie XiuQi if (rq->curr == p) 470e8c16495SXie XiuQi SEQ_printf(m, ">R"); 47120435d84SXie XiuQi else 47220435d84SXie XiuQi SEQ_printf(m, " %c", task_state_to_char(p)); 473391e43daSPeter Zijlstra 474391e43daSPeter Zijlstra SEQ_printf(m, "%15s %5d %9Ld.%06ld %9Ld %5d ", 475fc840914SPeter Zijlstra p->comm, task_pid_nr(p), 476391e43daSPeter Zijlstra SPLIT_NS(p->se.vruntime), 477391e43daSPeter Zijlstra (long long)(p->nvcsw + p->nivcsw), 478391e43daSPeter Zijlstra p->prio); 4799c572591SJosh Poimboeuf 480391e43daSPeter Zijlstra SEQ_printf(m, "%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld", 48120e1d486SJosh Poimboeuf SPLIT_NS(schedstat_val_or_zero(p->se.statistics.wait_sum)), 482391e43daSPeter Zijlstra SPLIT_NS(p->se.sum_exec_runtime), 48320e1d486SJosh Poimboeuf SPLIT_NS(schedstat_val_or_zero(p->se.statistics.sum_sleep_runtime))); 4849c572591SJosh Poimboeuf 485b32e86b4SIngo Molnar #ifdef CONFIG_NUMA_BALANCING 486e3d24d0aSSrikar Dronamraju SEQ_printf(m, " %d %d", task_node(p), task_numa_group_id(p)); 487b32e86b4SIngo Molnar #endif 488391e43daSPeter Zijlstra #ifdef CONFIG_CGROUP_SCHED 489391e43daSPeter Zijlstra SEQ_printf(m, " %s", task_group_path(task_group(p))); 490391e43daSPeter Zijlstra #endif 491391e43daSPeter Zijlstra 492391e43daSPeter Zijlstra SEQ_printf(m, "\n"); 493391e43daSPeter Zijlstra } 494391e43daSPeter Zijlstra 495391e43daSPeter Zijlstra static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu) 496391e43daSPeter Zijlstra { 497391e43daSPeter Zijlstra struct task_struct *g, *p; 498391e43daSPeter Zijlstra 499391e43daSPeter Zijlstra SEQ_printf(m, 500391e43daSPeter Zijlstra "\nrunnable tasks:\n" 501e8c16495SXie XiuQi " S task PID tree-key switches prio" 502c5f3ab1cSSrikar Dronamraju " wait-time sum-exec sum-sleep\n" 503e8c16495SXie XiuQi "-------------------------------------------------------" 504391e43daSPeter Zijlstra "----------------------------------------------------\n"); 505391e43daSPeter Zijlstra 5065bd96ab6SOleg Nesterov rcu_read_lock(); 507d38e83c7SOleg Nesterov for_each_process_thread(g, p) { 508b32e86b4SIngo Molnar if (task_cpu(p) != rq_cpu) 509391e43daSPeter Zijlstra continue; 510391e43daSPeter Zijlstra 511391e43daSPeter Zijlstra print_task(m, rq, p); 512d38e83c7SOleg Nesterov } 5135bd96ab6SOleg Nesterov rcu_read_unlock(); 514391e43daSPeter Zijlstra } 515391e43daSPeter Zijlstra 516391e43daSPeter Zijlstra void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) 517391e43daSPeter Zijlstra { 518391e43daSPeter Zijlstra s64 MIN_vruntime = -1, min_vruntime, max_vruntime = -1, 519391e43daSPeter Zijlstra spread, rq0_min_vruntime, spread0; 520391e43daSPeter Zijlstra struct rq *rq = cpu_rq(cpu); 521391e43daSPeter Zijlstra struct sched_entity *last; 522391e43daSPeter Zijlstra unsigned long flags; 523391e43daSPeter Zijlstra 524391e43daSPeter Zijlstra #ifdef CONFIG_FAIR_GROUP_SCHED 525391e43daSPeter Zijlstra SEQ_printf(m, "\ncfs_rq[%d]:%s\n", cpu, task_group_path(cfs_rq->tg)); 526391e43daSPeter Zijlstra #else 527391e43daSPeter Zijlstra SEQ_printf(m, "\ncfs_rq[%d]:\n", cpu); 528391e43daSPeter Zijlstra #endif 529391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "exec_clock", 530391e43daSPeter Zijlstra SPLIT_NS(cfs_rq->exec_clock)); 531391e43daSPeter Zijlstra 532391e43daSPeter Zijlstra raw_spin_lock_irqsave(&rq->lock, flags); 533391e43daSPeter Zijlstra if (cfs_rq->rb_leftmost) 534391e43daSPeter Zijlstra MIN_vruntime = (__pick_first_entity(cfs_rq))->vruntime; 535391e43daSPeter Zijlstra last = __pick_last_entity(cfs_rq); 536391e43daSPeter Zijlstra if (last) 537391e43daSPeter Zijlstra max_vruntime = last->vruntime; 538391e43daSPeter Zijlstra min_vruntime = cfs_rq->min_vruntime; 539391e43daSPeter Zijlstra rq0_min_vruntime = cpu_rq(0)->cfs.min_vruntime; 540391e43daSPeter Zijlstra raw_spin_unlock_irqrestore(&rq->lock, flags); 541391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "MIN_vruntime", 542391e43daSPeter Zijlstra SPLIT_NS(MIN_vruntime)); 543391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "min_vruntime", 544391e43daSPeter Zijlstra SPLIT_NS(min_vruntime)); 545391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "max_vruntime", 546391e43daSPeter Zijlstra SPLIT_NS(max_vruntime)); 547391e43daSPeter Zijlstra spread = max_vruntime - MIN_vruntime; 548391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "spread", 549391e43daSPeter Zijlstra SPLIT_NS(spread)); 550391e43daSPeter Zijlstra spread0 = min_vruntime - rq0_min_vruntime; 551391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "spread0", 552391e43daSPeter Zijlstra SPLIT_NS(spread0)); 553391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %d\n", "nr_spread_over", 554391e43daSPeter Zijlstra cfs_rq->nr_spread_over); 555c82513e5SPeter Zijlstra SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running); 556391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %ld\n", "load", cfs_rq->load.weight); 557391e43daSPeter Zijlstra #ifdef CONFIG_SMP 5589d89c257SYuyang Du SEQ_printf(m, " .%-30s: %lu\n", "load_avg", 5599d89c257SYuyang Du cfs_rq->avg.load_avg); 56013962234SYuyang Du SEQ_printf(m, " .%-30s: %lu\n", "runnable_load_avg", 56113962234SYuyang Du cfs_rq->runnable_load_avg); 5629d89c257SYuyang Du SEQ_printf(m, " .%-30s: %lu\n", "util_avg", 5639d89c257SYuyang Du cfs_rq->avg.util_avg); 5649d89c257SYuyang Du SEQ_printf(m, " .%-30s: %ld\n", "removed_load_avg", 5659d89c257SYuyang Du atomic_long_read(&cfs_rq->removed_load_avg)); 5669d89c257SYuyang Du SEQ_printf(m, " .%-30s: %ld\n", "removed_util_avg", 5679d89c257SYuyang Du atomic_long_read(&cfs_rq->removed_util_avg)); 568333bb864SAlex Shi #ifdef CONFIG_FAIR_GROUP_SCHED 5699d89c257SYuyang Du SEQ_printf(m, " .%-30s: %lu\n", "tg_load_avg_contrib", 5709d89c257SYuyang Du cfs_rq->tg_load_avg_contrib); 571333bb864SAlex Shi SEQ_printf(m, " .%-30s: %ld\n", "tg_load_avg", 572333bb864SAlex Shi atomic_long_read(&cfs_rq->tg->load_avg)); 573391e43daSPeter Zijlstra #endif 574333bb864SAlex Shi #endif 575f9f9ffc2SBen Segall #ifdef CONFIG_CFS_BANDWIDTH 576f9f9ffc2SBen Segall SEQ_printf(m, " .%-30s: %d\n", "throttled", 577f9f9ffc2SBen Segall cfs_rq->throttled); 578f9f9ffc2SBen Segall SEQ_printf(m, " .%-30s: %d\n", "throttle_count", 579f9f9ffc2SBen Segall cfs_rq->throttle_count); 580f9f9ffc2SBen Segall #endif 581391e43daSPeter Zijlstra 582333bb864SAlex Shi #ifdef CONFIG_FAIR_GROUP_SCHED 583391e43daSPeter Zijlstra print_cfs_group_stats(m, cpu, cfs_rq->tg); 584391e43daSPeter Zijlstra #endif 585391e43daSPeter Zijlstra } 586391e43daSPeter Zijlstra 587391e43daSPeter Zijlstra void print_rt_rq(struct seq_file *m, int cpu, struct rt_rq *rt_rq) 588391e43daSPeter Zijlstra { 589391e43daSPeter Zijlstra #ifdef CONFIG_RT_GROUP_SCHED 590391e43daSPeter Zijlstra SEQ_printf(m, "\nrt_rq[%d]:%s\n", cpu, task_group_path(rt_rq->tg)); 591391e43daSPeter Zijlstra #else 592391e43daSPeter Zijlstra SEQ_printf(m, "\nrt_rq[%d]:\n", cpu); 593391e43daSPeter Zijlstra #endif 594391e43daSPeter Zijlstra 595391e43daSPeter Zijlstra #define P(x) \ 596391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld\n", #x, (long long)(rt_rq->x)) 59748365b38SDaniel Bristot de Oliveira #define PU(x) \ 59848365b38SDaniel Bristot de Oliveira SEQ_printf(m, " .%-30s: %lu\n", #x, (unsigned long)(rt_rq->x)) 599391e43daSPeter Zijlstra #define PN(x) \ 600391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", #x, SPLIT_NS(rt_rq->x)) 601391e43daSPeter Zijlstra 60248365b38SDaniel Bristot de Oliveira PU(rt_nr_running); 60348365b38SDaniel Bristot de Oliveira #ifdef CONFIG_SMP 60448365b38SDaniel Bristot de Oliveira PU(rt_nr_migratory); 60548365b38SDaniel Bristot de Oliveira #endif 606391e43daSPeter Zijlstra P(rt_throttled); 607391e43daSPeter Zijlstra PN(rt_time); 608391e43daSPeter Zijlstra PN(rt_runtime); 609391e43daSPeter Zijlstra 610391e43daSPeter Zijlstra #undef PN 61148365b38SDaniel Bristot de Oliveira #undef PU 612391e43daSPeter Zijlstra #undef P 613391e43daSPeter Zijlstra } 614391e43daSPeter Zijlstra 615acb32132SWanpeng Li void print_dl_rq(struct seq_file *m, int cpu, struct dl_rq *dl_rq) 616acb32132SWanpeng Li { 617ef477183SSteven Rostedt (Red Hat) struct dl_bw *dl_bw; 618ef477183SSteven Rostedt (Red Hat) 619acb32132SWanpeng Li SEQ_printf(m, "\ndl_rq[%d]:\n", cpu); 62048365b38SDaniel Bristot de Oliveira 62148365b38SDaniel Bristot de Oliveira #define PU(x) \ 62248365b38SDaniel Bristot de Oliveira SEQ_printf(m, " .%-30s: %lu\n", #x, (unsigned long)(dl_rq->x)) 62348365b38SDaniel Bristot de Oliveira 62448365b38SDaniel Bristot de Oliveira PU(dl_nr_running); 625ef477183SSteven Rostedt (Red Hat) #ifdef CONFIG_SMP 62648365b38SDaniel Bristot de Oliveira PU(dl_nr_migratory); 627ef477183SSteven Rostedt (Red Hat) dl_bw = &cpu_rq(cpu)->rd->dl_bw; 628ef477183SSteven Rostedt (Red Hat) #else 629ef477183SSteven Rostedt (Red Hat) dl_bw = &dl_rq->dl_bw; 630ef477183SSteven Rostedt (Red Hat) #endif 631ef477183SSteven Rostedt (Red Hat) SEQ_printf(m, " .%-30s: %lld\n", "dl_bw->bw", dl_bw->bw); 632ef477183SSteven Rostedt (Red Hat) SEQ_printf(m, " .%-30s: %lld\n", "dl_bw->total_bw", dl_bw->total_bw); 63348365b38SDaniel Bristot de Oliveira 63448365b38SDaniel Bristot de Oliveira #undef PU 635acb32132SWanpeng Li } 636acb32132SWanpeng Li 637391e43daSPeter Zijlstra extern __read_mostly int sched_clock_running; 638391e43daSPeter Zijlstra 639391e43daSPeter Zijlstra static void print_cpu(struct seq_file *m, int cpu) 640391e43daSPeter Zijlstra { 641391e43daSPeter Zijlstra struct rq *rq = cpu_rq(cpu); 642391e43daSPeter Zijlstra unsigned long flags; 643391e43daSPeter Zijlstra 644391e43daSPeter Zijlstra #ifdef CONFIG_X86 645391e43daSPeter Zijlstra { 646391e43daSPeter Zijlstra unsigned int freq = cpu_khz ? : 1; 647391e43daSPeter Zijlstra 648bbbfeac9SNathan Zimmer SEQ_printf(m, "cpu#%d, %u.%03u MHz\n", 649391e43daSPeter Zijlstra cpu, freq / 1000, (freq % 1000)); 650391e43daSPeter Zijlstra } 651391e43daSPeter Zijlstra #else 652bbbfeac9SNathan Zimmer SEQ_printf(m, "cpu#%d\n", cpu); 653391e43daSPeter Zijlstra #endif 654391e43daSPeter Zijlstra 655391e43daSPeter Zijlstra #define P(x) \ 65613e099d2SPeter Zijlstra do { \ 65713e099d2SPeter Zijlstra if (sizeof(rq->x) == 4) \ 65813e099d2SPeter Zijlstra SEQ_printf(m, " .%-30s: %ld\n", #x, (long)(rq->x)); \ 65913e099d2SPeter Zijlstra else \ 66013e099d2SPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld\n", #x, (long long)(rq->x));\ 66113e099d2SPeter Zijlstra } while (0) 66213e099d2SPeter Zijlstra 663391e43daSPeter Zijlstra #define PN(x) \ 664391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %Ld.%06ld\n", #x, SPLIT_NS(rq->x)) 665391e43daSPeter Zijlstra 666391e43daSPeter Zijlstra P(nr_running); 667391e43daSPeter Zijlstra SEQ_printf(m, " .%-30s: %lu\n", "load", 668391e43daSPeter Zijlstra rq->load.weight); 669391e43daSPeter Zijlstra P(nr_switches); 670391e43daSPeter Zijlstra P(nr_load_updates); 671391e43daSPeter Zijlstra P(nr_uninterruptible); 672391e43daSPeter Zijlstra PN(next_balance); 673fc840914SPeter Zijlstra SEQ_printf(m, " .%-30s: %ld\n", "curr->pid", (long)(task_pid_nr(rq->curr))); 674391e43daSPeter Zijlstra PN(clock); 6755a537597SPeter Zijlstra PN(clock_task); 676391e43daSPeter Zijlstra P(cpu_load[0]); 677391e43daSPeter Zijlstra P(cpu_load[1]); 678391e43daSPeter Zijlstra P(cpu_load[2]); 679391e43daSPeter Zijlstra P(cpu_load[3]); 680391e43daSPeter Zijlstra P(cpu_load[4]); 681391e43daSPeter Zijlstra #undef P 682391e43daSPeter Zijlstra #undef PN 683391e43daSPeter Zijlstra 684391e43daSPeter Zijlstra #ifdef CONFIG_SMP 685db6ea2fbSWanpeng Li #define P64(n) SEQ_printf(m, " .%-30s: %Ld\n", #n, rq->n); 686391e43daSPeter Zijlstra P64(avg_idle); 68737e6bae8SAlex Shi P64(max_idle_balance_cost); 688db6ea2fbSWanpeng Li #undef P64 689391e43daSPeter Zijlstra #endif 690391e43daSPeter Zijlstra 6914fa8d299SJosh Poimboeuf #define P(n) SEQ_printf(m, " .%-30s: %d\n", #n, schedstat_val(rq->n)); 692cb251765SMel Gorman if (schedstat_enabled()) { 693cb251765SMel Gorman P(yld_count); 694cb251765SMel Gorman P(sched_count); 695cb251765SMel Gorman P(sched_goidle); 696391e43daSPeter Zijlstra P(ttwu_count); 697391e43daSPeter Zijlstra P(ttwu_local); 698cb251765SMel Gorman } 699391e43daSPeter Zijlstra #undef P 7004fa8d299SJosh Poimboeuf 701391e43daSPeter Zijlstra spin_lock_irqsave(&sched_debug_lock, flags); 702391e43daSPeter Zijlstra print_cfs_stats(m, cpu); 703391e43daSPeter Zijlstra print_rt_stats(m, cpu); 704acb32132SWanpeng Li print_dl_stats(m, cpu); 705391e43daSPeter Zijlstra 706391e43daSPeter Zijlstra print_rq(m, rq, cpu); 707391e43daSPeter Zijlstra spin_unlock_irqrestore(&sched_debug_lock, flags); 708bbbfeac9SNathan Zimmer SEQ_printf(m, "\n"); 709391e43daSPeter Zijlstra } 710391e43daSPeter Zijlstra 711391e43daSPeter Zijlstra static const char *sched_tunable_scaling_names[] = { 712391e43daSPeter Zijlstra "none", 713391e43daSPeter Zijlstra "logaritmic", 714391e43daSPeter Zijlstra "linear" 715391e43daSPeter Zijlstra }; 716391e43daSPeter Zijlstra 717bbbfeac9SNathan Zimmer static void sched_debug_header(struct seq_file *m) 718391e43daSPeter Zijlstra { 719391e43daSPeter Zijlstra u64 ktime, sched_clk, cpu_clk; 720391e43daSPeter Zijlstra unsigned long flags; 721391e43daSPeter Zijlstra 722391e43daSPeter Zijlstra local_irq_save(flags); 723391e43daSPeter Zijlstra ktime = ktime_to_ns(ktime_get()); 724391e43daSPeter Zijlstra sched_clk = sched_clock(); 725391e43daSPeter Zijlstra cpu_clk = local_clock(); 726391e43daSPeter Zijlstra local_irq_restore(flags); 727391e43daSPeter Zijlstra 728b32e86b4SIngo Molnar SEQ_printf(m, "Sched Debug Version: v0.11, %s %.*s\n", 729391e43daSPeter Zijlstra init_utsname()->release, 730391e43daSPeter Zijlstra (int)strcspn(init_utsname()->version, " "), 731391e43daSPeter Zijlstra init_utsname()->version); 732391e43daSPeter Zijlstra 733391e43daSPeter Zijlstra #define P(x) \ 734391e43daSPeter Zijlstra SEQ_printf(m, "%-40s: %Ld\n", #x, (long long)(x)) 735391e43daSPeter Zijlstra #define PN(x) \ 736391e43daSPeter Zijlstra SEQ_printf(m, "%-40s: %Ld.%06ld\n", #x, SPLIT_NS(x)) 737391e43daSPeter Zijlstra PN(ktime); 738391e43daSPeter Zijlstra PN(sched_clk); 739391e43daSPeter Zijlstra PN(cpu_clk); 740391e43daSPeter Zijlstra P(jiffies); 741391e43daSPeter Zijlstra #ifdef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK 74235af99e6SPeter Zijlstra P(sched_clock_stable()); 743391e43daSPeter Zijlstra #endif 744391e43daSPeter Zijlstra #undef PN 745391e43daSPeter Zijlstra #undef P 746391e43daSPeter Zijlstra 747391e43daSPeter Zijlstra SEQ_printf(m, "\n"); 748391e43daSPeter Zijlstra SEQ_printf(m, "sysctl_sched\n"); 749391e43daSPeter Zijlstra 750391e43daSPeter Zijlstra #define P(x) \ 751391e43daSPeter Zijlstra SEQ_printf(m, " .%-40s: %Ld\n", #x, (long long)(x)) 752391e43daSPeter Zijlstra #define PN(x) \ 753391e43daSPeter Zijlstra SEQ_printf(m, " .%-40s: %Ld.%06ld\n", #x, SPLIT_NS(x)) 754391e43daSPeter Zijlstra PN(sysctl_sched_latency); 755391e43daSPeter Zijlstra PN(sysctl_sched_min_granularity); 756391e43daSPeter Zijlstra PN(sysctl_sched_wakeup_granularity); 757391e43daSPeter Zijlstra P(sysctl_sched_child_runs_first); 758391e43daSPeter Zijlstra P(sysctl_sched_features); 759391e43daSPeter Zijlstra #undef PN 760391e43daSPeter Zijlstra #undef P 761391e43daSPeter Zijlstra 762bbbfeac9SNathan Zimmer SEQ_printf(m, " .%-40s: %d (%s)\n", 763bbbfeac9SNathan Zimmer "sysctl_sched_tunable_scaling", 764391e43daSPeter Zijlstra sysctl_sched_tunable_scaling, 765391e43daSPeter Zijlstra sched_tunable_scaling_names[sysctl_sched_tunable_scaling]); 766391e43daSPeter Zijlstra SEQ_printf(m, "\n"); 767bbbfeac9SNathan Zimmer } 768bbbfeac9SNathan Zimmer 769bbbfeac9SNathan Zimmer static int sched_debug_show(struct seq_file *m, void *v) 770bbbfeac9SNathan Zimmer { 771bbbfeac9SNathan Zimmer int cpu = (unsigned long)(v - 2); 772bbbfeac9SNathan Zimmer 773bbbfeac9SNathan Zimmer if (cpu != -1) 774bbbfeac9SNathan Zimmer print_cpu(m, cpu); 775bbbfeac9SNathan Zimmer else 776bbbfeac9SNathan Zimmer sched_debug_header(m); 777391e43daSPeter Zijlstra 778391e43daSPeter Zijlstra return 0; 779391e43daSPeter Zijlstra } 780391e43daSPeter Zijlstra 781391e43daSPeter Zijlstra void sysrq_sched_debug_show(void) 782391e43daSPeter Zijlstra { 783bbbfeac9SNathan Zimmer int cpu; 784bbbfeac9SNathan Zimmer 785bbbfeac9SNathan Zimmer sched_debug_header(NULL); 786bbbfeac9SNathan Zimmer for_each_online_cpu(cpu) 787bbbfeac9SNathan Zimmer print_cpu(NULL, cpu); 788bbbfeac9SNathan Zimmer 789bbbfeac9SNathan Zimmer } 790bbbfeac9SNathan Zimmer 791bbbfeac9SNathan Zimmer /* 792bbbfeac9SNathan Zimmer * This itererator needs some explanation. 793bbbfeac9SNathan Zimmer * It returns 1 for the header position. 794bbbfeac9SNathan Zimmer * This means 2 is cpu 0. 795bbbfeac9SNathan Zimmer * In a hotplugged system some cpus, including cpu 0, may be missing so we have 796bbbfeac9SNathan Zimmer * to use cpumask_* to iterate over the cpus. 797bbbfeac9SNathan Zimmer */ 798bbbfeac9SNathan Zimmer static void *sched_debug_start(struct seq_file *file, loff_t *offset) 799bbbfeac9SNathan Zimmer { 800bbbfeac9SNathan Zimmer unsigned long n = *offset; 801bbbfeac9SNathan Zimmer 802bbbfeac9SNathan Zimmer if (n == 0) 803bbbfeac9SNathan Zimmer return (void *) 1; 804bbbfeac9SNathan Zimmer 805bbbfeac9SNathan Zimmer n--; 806bbbfeac9SNathan Zimmer 807bbbfeac9SNathan Zimmer if (n > 0) 808bbbfeac9SNathan Zimmer n = cpumask_next(n - 1, cpu_online_mask); 809bbbfeac9SNathan Zimmer else 810bbbfeac9SNathan Zimmer n = cpumask_first(cpu_online_mask); 811bbbfeac9SNathan Zimmer 812bbbfeac9SNathan Zimmer *offset = n + 1; 813bbbfeac9SNathan Zimmer 814bbbfeac9SNathan Zimmer if (n < nr_cpu_ids) 815bbbfeac9SNathan Zimmer return (void *)(unsigned long)(n + 2); 816bbbfeac9SNathan Zimmer return NULL; 817bbbfeac9SNathan Zimmer } 818bbbfeac9SNathan Zimmer 819bbbfeac9SNathan Zimmer static void *sched_debug_next(struct seq_file *file, void *data, loff_t *offset) 820bbbfeac9SNathan Zimmer { 821bbbfeac9SNathan Zimmer (*offset)++; 822bbbfeac9SNathan Zimmer return sched_debug_start(file, offset); 823bbbfeac9SNathan Zimmer } 824bbbfeac9SNathan Zimmer 825bbbfeac9SNathan Zimmer static void sched_debug_stop(struct seq_file *file, void *data) 826bbbfeac9SNathan Zimmer { 827bbbfeac9SNathan Zimmer } 828bbbfeac9SNathan Zimmer 829bbbfeac9SNathan Zimmer static const struct seq_operations sched_debug_sops = { 830bbbfeac9SNathan Zimmer .start = sched_debug_start, 831bbbfeac9SNathan Zimmer .next = sched_debug_next, 832bbbfeac9SNathan Zimmer .stop = sched_debug_stop, 833bbbfeac9SNathan Zimmer .show = sched_debug_show, 834bbbfeac9SNathan Zimmer }; 835bbbfeac9SNathan Zimmer 836bbbfeac9SNathan Zimmer static int sched_debug_release(struct inode *inode, struct file *file) 837bbbfeac9SNathan Zimmer { 838bbbfeac9SNathan Zimmer seq_release(inode, file); 839bbbfeac9SNathan Zimmer 840bbbfeac9SNathan Zimmer return 0; 841391e43daSPeter Zijlstra } 842391e43daSPeter Zijlstra 843391e43daSPeter Zijlstra static int sched_debug_open(struct inode *inode, struct file *filp) 844391e43daSPeter Zijlstra { 845bbbfeac9SNathan Zimmer int ret = 0; 846bbbfeac9SNathan Zimmer 847bbbfeac9SNathan Zimmer ret = seq_open(filp, &sched_debug_sops); 848bbbfeac9SNathan Zimmer 849bbbfeac9SNathan Zimmer return ret; 850391e43daSPeter Zijlstra } 851391e43daSPeter Zijlstra 852391e43daSPeter Zijlstra static const struct file_operations sched_debug_fops = { 853391e43daSPeter Zijlstra .open = sched_debug_open, 854391e43daSPeter Zijlstra .read = seq_read, 855391e43daSPeter Zijlstra .llseek = seq_lseek, 856bbbfeac9SNathan Zimmer .release = sched_debug_release, 857391e43daSPeter Zijlstra }; 858391e43daSPeter Zijlstra 859391e43daSPeter Zijlstra static int __init init_sched_debug_procfs(void) 860391e43daSPeter Zijlstra { 861391e43daSPeter Zijlstra struct proc_dir_entry *pe; 862391e43daSPeter Zijlstra 863391e43daSPeter Zijlstra pe = proc_create("sched_debug", 0444, NULL, &sched_debug_fops); 864391e43daSPeter Zijlstra if (!pe) 865391e43daSPeter Zijlstra return -ENOMEM; 866391e43daSPeter Zijlstra return 0; 867391e43daSPeter Zijlstra } 868391e43daSPeter Zijlstra 869391e43daSPeter Zijlstra __initcall(init_sched_debug_procfs); 870391e43daSPeter Zijlstra 871b32e86b4SIngo Molnar #define __P(F) \ 872b32e86b4SIngo Molnar SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F) 873b32e86b4SIngo Molnar #define P(F) \ 874b32e86b4SIngo Molnar SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F) 875b32e86b4SIngo Molnar #define __PN(F) \ 876b32e86b4SIngo Molnar SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F)) 877b32e86b4SIngo Molnar #define PN(F) \ 878b32e86b4SIngo Molnar SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F)) 879b32e86b4SIngo Molnar 880b32e86b4SIngo Molnar 881397f2378SSrikar Dronamraju #ifdef CONFIG_NUMA_BALANCING 882397f2378SSrikar Dronamraju void print_numa_stats(struct seq_file *m, int node, unsigned long tsf, 883397f2378SSrikar Dronamraju unsigned long tpf, unsigned long gsf, unsigned long gpf) 884397f2378SSrikar Dronamraju { 885397f2378SSrikar Dronamraju SEQ_printf(m, "numa_faults node=%d ", node); 886397f2378SSrikar Dronamraju SEQ_printf(m, "task_private=%lu task_shared=%lu ", tsf, tpf); 887397f2378SSrikar Dronamraju SEQ_printf(m, "group_private=%lu group_shared=%lu\n", gsf, gpf); 888397f2378SSrikar Dronamraju } 889397f2378SSrikar Dronamraju #endif 890397f2378SSrikar Dronamraju 891397f2378SSrikar Dronamraju 892b32e86b4SIngo Molnar static void sched_show_numa(struct task_struct *p, struct seq_file *m) 893b32e86b4SIngo Molnar { 894b32e86b4SIngo Molnar #ifdef CONFIG_NUMA_BALANCING 895b32e86b4SIngo Molnar struct mempolicy *pol; 896b32e86b4SIngo Molnar 897b32e86b4SIngo Molnar if (p->mm) 898b32e86b4SIngo Molnar P(mm->numa_scan_seq); 899b32e86b4SIngo Molnar 900b32e86b4SIngo Molnar task_lock(p); 901b32e86b4SIngo Molnar pol = p->mempolicy; 902b32e86b4SIngo Molnar if (pol && !(pol->flags & MPOL_F_MORON)) 903b32e86b4SIngo Molnar pol = NULL; 904b32e86b4SIngo Molnar mpol_get(pol); 905b32e86b4SIngo Molnar task_unlock(p); 906b32e86b4SIngo Molnar 907397f2378SSrikar Dronamraju P(numa_pages_migrated); 908397f2378SSrikar Dronamraju P(numa_preferred_nid); 909397f2378SSrikar Dronamraju P(total_numa_faults); 910397f2378SSrikar Dronamraju SEQ_printf(m, "current_node=%d, numa_group_id=%d\n", 911397f2378SSrikar Dronamraju task_node(p), task_numa_group_id(p)); 912397f2378SSrikar Dronamraju show_numa_stats(p, m); 913b32e86b4SIngo Molnar mpol_put(pol); 914b32e86b4SIngo Molnar #endif 915b32e86b4SIngo Molnar } 916b32e86b4SIngo Molnar 91774dc3384SAleksa Sarai void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, 91874dc3384SAleksa Sarai struct seq_file *m) 919391e43daSPeter Zijlstra { 920391e43daSPeter Zijlstra unsigned long nr_switches; 921391e43daSPeter Zijlstra 92274dc3384SAleksa Sarai SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm, task_pid_nr_ns(p, ns), 923391e43daSPeter Zijlstra get_nr_threads(p)); 924391e43daSPeter Zijlstra SEQ_printf(m, 925add332a1SKamalesh Babulal "---------------------------------------------------------" 926add332a1SKamalesh Babulal "----------\n"); 927391e43daSPeter Zijlstra #define __P(F) \ 928add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F) 929391e43daSPeter Zijlstra #define P(F) \ 930add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F) 9314fa8d299SJosh Poimboeuf #define P_SCHEDSTAT(F) \ 9324fa8d299SJosh Poimboeuf SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)schedstat_val(p->F)) 933391e43daSPeter Zijlstra #define __PN(F) \ 934add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F)) 935391e43daSPeter Zijlstra #define PN(F) \ 936add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F)) 9374fa8d299SJosh Poimboeuf #define PN_SCHEDSTAT(F) \ 9384fa8d299SJosh Poimboeuf SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)schedstat_val(p->F))) 939391e43daSPeter Zijlstra 940391e43daSPeter Zijlstra PN(se.exec_start); 941391e43daSPeter Zijlstra PN(se.vruntime); 942391e43daSPeter Zijlstra PN(se.sum_exec_runtime); 943391e43daSPeter Zijlstra 944391e43daSPeter Zijlstra nr_switches = p->nvcsw + p->nivcsw; 945391e43daSPeter Zijlstra 946cb251765SMel Gorman P(se.nr_migrations); 947cb251765SMel Gorman 948cb251765SMel Gorman if (schedstat_enabled()) { 949cb251765SMel Gorman u64 avg_atom, avg_per_cpu; 950cb251765SMel Gorman 9514fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.sum_sleep_runtime); 9524fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.wait_start); 9534fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.sleep_start); 9544fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.block_start); 9554fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.sleep_max); 9564fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.block_max); 9574fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.exec_max); 9584fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.slice_max); 9594fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.wait_max); 9604fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.wait_sum); 9614fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.wait_count); 9624fa8d299SJosh Poimboeuf PN_SCHEDSTAT(se.statistics.iowait_sum); 9634fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.iowait_count); 9644fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_migrations_cold); 9654fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_failed_migrations_affine); 9664fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_failed_migrations_running); 9674fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_failed_migrations_hot); 9684fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_forced_migrations); 9694fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups); 9704fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_sync); 9714fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_migrate); 9724fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_local); 9734fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_remote); 9744fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_affine); 9754fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_affine_attempts); 9764fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_passive); 9774fa8d299SJosh Poimboeuf P_SCHEDSTAT(se.statistics.nr_wakeups_idle); 978391e43daSPeter Zijlstra 979391e43daSPeter Zijlstra avg_atom = p->se.sum_exec_runtime; 980391e43daSPeter Zijlstra if (nr_switches) 981b0ab99e7SMateusz Guzik avg_atom = div64_ul(avg_atom, nr_switches); 982391e43daSPeter Zijlstra else 983391e43daSPeter Zijlstra avg_atom = -1LL; 984391e43daSPeter Zijlstra 985391e43daSPeter Zijlstra avg_per_cpu = p->se.sum_exec_runtime; 986391e43daSPeter Zijlstra if (p->se.nr_migrations) { 987391e43daSPeter Zijlstra avg_per_cpu = div64_u64(avg_per_cpu, 988391e43daSPeter Zijlstra p->se.nr_migrations); 989391e43daSPeter Zijlstra } else { 990391e43daSPeter Zijlstra avg_per_cpu = -1LL; 991391e43daSPeter Zijlstra } 992391e43daSPeter Zijlstra 993391e43daSPeter Zijlstra __PN(avg_atom); 994391e43daSPeter Zijlstra __PN(avg_per_cpu); 995391e43daSPeter Zijlstra } 9964fa8d299SJosh Poimboeuf 997391e43daSPeter Zijlstra __P(nr_switches); 998add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%21Ld\n", 999391e43daSPeter Zijlstra "nr_voluntary_switches", (long long)p->nvcsw); 1000add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%21Ld\n", 1001391e43daSPeter Zijlstra "nr_involuntary_switches", (long long)p->nivcsw); 1002391e43daSPeter Zijlstra 1003391e43daSPeter Zijlstra P(se.load.weight); 1004333bb864SAlex Shi #ifdef CONFIG_SMP 10059d89c257SYuyang Du P(se.avg.load_sum); 10069d89c257SYuyang Du P(se.avg.util_sum); 10079d89c257SYuyang Du P(se.avg.load_avg); 10089d89c257SYuyang Du P(se.avg.util_avg); 10099d89c257SYuyang Du P(se.avg.last_update_time); 1010939fd731SKamalesh Babulal #endif 1011391e43daSPeter Zijlstra P(policy); 1012391e43daSPeter Zijlstra P(prio); 101359f8c298STommaso Cucinotta if (p->policy == SCHED_DEADLINE) { 101459f8c298STommaso Cucinotta P(dl.runtime); 101559f8c298STommaso Cucinotta P(dl.deadline); 101659f8c298STommaso Cucinotta } 10174fa8d299SJosh Poimboeuf #undef PN_SCHEDSTAT 1018391e43daSPeter Zijlstra #undef PN 1019391e43daSPeter Zijlstra #undef __PN 10204fa8d299SJosh Poimboeuf #undef P_SCHEDSTAT 1021391e43daSPeter Zijlstra #undef P 1022391e43daSPeter Zijlstra #undef __P 1023391e43daSPeter Zijlstra 1024391e43daSPeter Zijlstra { 1025391e43daSPeter Zijlstra unsigned int this_cpu = raw_smp_processor_id(); 1026391e43daSPeter Zijlstra u64 t0, t1; 1027391e43daSPeter Zijlstra 1028391e43daSPeter Zijlstra t0 = cpu_clock(this_cpu); 1029391e43daSPeter Zijlstra t1 = cpu_clock(this_cpu); 1030add332a1SKamalesh Babulal SEQ_printf(m, "%-45s:%21Ld\n", 1031391e43daSPeter Zijlstra "clock-delta", (long long)(t1-t0)); 1032391e43daSPeter Zijlstra } 1033b32e86b4SIngo Molnar 1034b32e86b4SIngo Molnar sched_show_numa(p, m); 1035391e43daSPeter Zijlstra } 1036391e43daSPeter Zijlstra 1037391e43daSPeter Zijlstra void proc_sched_set_task(struct task_struct *p) 1038391e43daSPeter Zijlstra { 1039391e43daSPeter Zijlstra #ifdef CONFIG_SCHEDSTATS 1040391e43daSPeter Zijlstra memset(&p->se.statistics, 0, sizeof(p->se.statistics)); 1041391e43daSPeter Zijlstra #endif 1042391e43daSPeter Zijlstra } 1043