xref: /linux-6.15/kernel/sched/debug.c (revision 56209334)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2391e43daSPeter Zijlstra /*
3391e43daSPeter Zijlstra  * kernel/sched/debug.c
4391e43daSPeter Zijlstra  *
5325ea10cSIngo Molnar  * Print the CFS rbtree and other debugging details
6391e43daSPeter Zijlstra  *
7391e43daSPeter Zijlstra  * Copyright(C) 2007, Red Hat, Inc., Ingo Molnar
8391e43daSPeter Zijlstra  */
9391e43daSPeter Zijlstra 
10391e43daSPeter Zijlstra /*
11622f0a1dSSebastian Andrzej Siewior  * This allows printing both to /sys/kernel/debug/sched/debug and
12391e43daSPeter Zijlstra  * to the console
13391e43daSPeter Zijlstra  */
14391e43daSPeter Zijlstra #define SEQ_printf(m, x...)			\
15391e43daSPeter Zijlstra  do {						\
16391e43daSPeter Zijlstra 	if (m)					\
17391e43daSPeter Zijlstra 		seq_printf(m, x);		\
18391e43daSPeter Zijlstra 	else					\
19a8c024cdSJoe Lawrence 		pr_cont(x);			\
20391e43daSPeter Zijlstra  } while (0)
21391e43daSPeter Zijlstra 
22391e43daSPeter Zijlstra /*
23391e43daSPeter Zijlstra  * Ease the printing of nsec fields:
24391e43daSPeter Zijlstra  */
nsec_high(unsigned long long nsec)25391e43daSPeter Zijlstra static long long nsec_high(unsigned long long nsec)
26391e43daSPeter Zijlstra {
27391e43daSPeter Zijlstra 	if ((long long)nsec < 0) {
28391e43daSPeter Zijlstra 		nsec = -nsec;
29391e43daSPeter Zijlstra 		do_div(nsec, 1000000);
30391e43daSPeter Zijlstra 		return -nsec;
31391e43daSPeter Zijlstra 	}
32391e43daSPeter Zijlstra 	do_div(nsec, 1000000);
33391e43daSPeter Zijlstra 
34391e43daSPeter Zijlstra 	return nsec;
35391e43daSPeter Zijlstra }
36391e43daSPeter Zijlstra 
nsec_low(unsigned long long nsec)37391e43daSPeter Zijlstra static unsigned long nsec_low(unsigned long long nsec)
38391e43daSPeter Zijlstra {
39391e43daSPeter Zijlstra 	if ((long long)nsec < 0)
40391e43daSPeter Zijlstra 		nsec = -nsec;
41391e43daSPeter Zijlstra 
42391e43daSPeter Zijlstra 	return do_div(nsec, 1000000);
43391e43daSPeter Zijlstra }
44391e43daSPeter Zijlstra 
45391e43daSPeter Zijlstra #define SPLIT_NS(x) nsec_high(x), nsec_low(x)
46391e43daSPeter Zijlstra 
47d6ca41d7SSteven Rostedt (Red Hat) #define SCHED_FEAT(name, enabled)	\
48d6ca41d7SSteven Rostedt (Red Hat) 	#name ,
49d6ca41d7SSteven Rostedt (Red Hat) 
50d6ca41d7SSteven Rostedt (Red Hat) static const char * const sched_feat_names[] = {
51d6ca41d7SSteven Rostedt (Red Hat) #include "features.h"
52d6ca41d7SSteven Rostedt (Red Hat) };
53d6ca41d7SSteven Rostedt (Red Hat) 
54d6ca41d7SSteven Rostedt (Red Hat) #undef SCHED_FEAT
55d6ca41d7SSteven Rostedt (Red Hat) 
sched_feat_show(struct seq_file * m,void * v)56d6ca41d7SSteven Rostedt (Red Hat) static int sched_feat_show(struct seq_file *m, void *v)
57d6ca41d7SSteven Rostedt (Red Hat) {
58d6ca41d7SSteven Rostedt (Red Hat) 	int i;
59d6ca41d7SSteven Rostedt (Red Hat) 
60d6ca41d7SSteven Rostedt (Red Hat) 	for (i = 0; i < __SCHED_FEAT_NR; i++) {
61d6ca41d7SSteven Rostedt (Red Hat) 		if (!(sysctl_sched_features & (1UL << i)))
62d6ca41d7SSteven Rostedt (Red Hat) 			seq_puts(m, "NO_");
63d6ca41d7SSteven Rostedt (Red Hat) 		seq_printf(m, "%s ", sched_feat_names[i]);
64d6ca41d7SSteven Rostedt (Red Hat) 	}
65d6ca41d7SSteven Rostedt (Red Hat) 	seq_puts(m, "\n");
66d6ca41d7SSteven Rostedt (Red Hat) 
67d6ca41d7SSteven Rostedt (Red Hat) 	return 0;
68d6ca41d7SSteven Rostedt (Red Hat) }
69d6ca41d7SSteven Rostedt (Red Hat) 
70e9666d10SMasahiro Yamada #ifdef CONFIG_JUMP_LABEL
71d6ca41d7SSteven Rostedt (Red Hat) 
72d6ca41d7SSteven Rostedt (Red Hat) #define jump_label_key__true  STATIC_KEY_INIT_TRUE
73d6ca41d7SSteven Rostedt (Red Hat) #define jump_label_key__false STATIC_KEY_INIT_FALSE
74d6ca41d7SSteven Rostedt (Red Hat) 
75d6ca41d7SSteven Rostedt (Red Hat) #define SCHED_FEAT(name, enabled)	\
76d6ca41d7SSteven Rostedt (Red Hat) 	jump_label_key__##enabled ,
77d6ca41d7SSteven Rostedt (Red Hat) 
78d6ca41d7SSteven Rostedt (Red Hat) struct static_key sched_feat_keys[__SCHED_FEAT_NR] = {
79d6ca41d7SSteven Rostedt (Red Hat) #include "features.h"
80d6ca41d7SSteven Rostedt (Red Hat) };
81d6ca41d7SSteven Rostedt (Red Hat) 
82d6ca41d7SSteven Rostedt (Red Hat) #undef SCHED_FEAT
83d6ca41d7SSteven Rostedt (Red Hat) 
sched_feat_disable(int i)84d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_disable(int i)
85d6ca41d7SSteven Rostedt (Red Hat) {
86e73e8197SJiada Wang 	static_key_disable_cpuslocked(&sched_feat_keys[i]);
87d6ca41d7SSteven Rostedt (Red Hat) }
88d6ca41d7SSteven Rostedt (Red Hat) 
sched_feat_enable(int i)89d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_enable(int i)
90d6ca41d7SSteven Rostedt (Red Hat) {
91e73e8197SJiada Wang 	static_key_enable_cpuslocked(&sched_feat_keys[i]);
92d6ca41d7SSteven Rostedt (Red Hat) }
93d6ca41d7SSteven Rostedt (Red Hat) #else
sched_feat_disable(int i)94d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_disable(int i) { };
sched_feat_enable(int i)95d6ca41d7SSteven Rostedt (Red Hat) static void sched_feat_enable(int i) { };
96e9666d10SMasahiro Yamada #endif /* CONFIG_JUMP_LABEL */
97d6ca41d7SSteven Rostedt (Red Hat) 
sched_feat_set(char * cmp)98d6ca41d7SSteven Rostedt (Red Hat) static int sched_feat_set(char *cmp)
99d6ca41d7SSteven Rostedt (Red Hat) {
100d6ca41d7SSteven Rostedt (Red Hat) 	int i;
101d6ca41d7SSteven Rostedt (Red Hat) 	int neg = 0;
102d6ca41d7SSteven Rostedt (Red Hat) 
103d6ca41d7SSteven Rostedt (Red Hat) 	if (strncmp(cmp, "NO_", 3) == 0) {
104d6ca41d7SSteven Rostedt (Red Hat) 		neg = 1;
105d6ca41d7SSteven Rostedt (Red Hat) 		cmp += 3;
106d6ca41d7SSteven Rostedt (Red Hat) 	}
107d6ca41d7SSteven Rostedt (Red Hat) 
1088f894bf4SYisheng Xie 	i = match_string(sched_feat_names, __SCHED_FEAT_NR, cmp);
1098f894bf4SYisheng Xie 	if (i < 0)
1108f894bf4SYisheng Xie 		return i;
1118f894bf4SYisheng Xie 
112d6ca41d7SSteven Rostedt (Red Hat) 	if (neg) {
113d6ca41d7SSteven Rostedt (Red Hat) 		sysctl_sched_features &= ~(1UL << i);
114d6ca41d7SSteven Rostedt (Red Hat) 		sched_feat_disable(i);
115d6ca41d7SSteven Rostedt (Red Hat) 	} else {
116d6ca41d7SSteven Rostedt (Red Hat) 		sysctl_sched_features |= (1UL << i);
117d6ca41d7SSteven Rostedt (Red Hat) 		sched_feat_enable(i);
118d6ca41d7SSteven Rostedt (Red Hat) 	}
119d6ca41d7SSteven Rostedt (Red Hat) 
1208f894bf4SYisheng Xie 	return 0;
121d6ca41d7SSteven Rostedt (Red Hat) }
122d6ca41d7SSteven Rostedt (Red Hat) 
123d6ca41d7SSteven Rostedt (Red Hat) static ssize_t
sched_feat_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos)124d6ca41d7SSteven Rostedt (Red Hat) sched_feat_write(struct file *filp, const char __user *ubuf,
125d6ca41d7SSteven Rostedt (Red Hat) 		size_t cnt, loff_t *ppos)
126d6ca41d7SSteven Rostedt (Red Hat) {
127d6ca41d7SSteven Rostedt (Red Hat) 	char buf[64];
128d6ca41d7SSteven Rostedt (Red Hat) 	char *cmp;
1298f894bf4SYisheng Xie 	int ret;
130d6ca41d7SSteven Rostedt (Red Hat) 	struct inode *inode;
131d6ca41d7SSteven Rostedt (Red Hat) 
132d6ca41d7SSteven Rostedt (Red Hat) 	if (cnt > 63)
133d6ca41d7SSteven Rostedt (Red Hat) 		cnt = 63;
134d6ca41d7SSteven Rostedt (Red Hat) 
135d6ca41d7SSteven Rostedt (Red Hat) 	if (copy_from_user(&buf, ubuf, cnt))
136d6ca41d7SSteven Rostedt (Red Hat) 		return -EFAULT;
137d6ca41d7SSteven Rostedt (Red Hat) 
138d6ca41d7SSteven Rostedt (Red Hat) 	buf[cnt] = 0;
139d6ca41d7SSteven Rostedt (Red Hat) 	cmp = strstrip(buf);
140d6ca41d7SSteven Rostedt (Red Hat) 
141d6ca41d7SSteven Rostedt (Red Hat) 	/* Ensure the static_key remains in a consistent state */
142d6ca41d7SSteven Rostedt (Red Hat) 	inode = file_inode(filp);
143e73e8197SJiada Wang 	cpus_read_lock();
144d6ca41d7SSteven Rostedt (Red Hat) 	inode_lock(inode);
1458f894bf4SYisheng Xie 	ret = sched_feat_set(cmp);
146d6ca41d7SSteven Rostedt (Red Hat) 	inode_unlock(inode);
147e73e8197SJiada Wang 	cpus_read_unlock();
1488f894bf4SYisheng Xie 	if (ret < 0)
1498f894bf4SYisheng Xie 		return ret;
150d6ca41d7SSteven Rostedt (Red Hat) 
151d6ca41d7SSteven Rostedt (Red Hat) 	*ppos += cnt;
152d6ca41d7SSteven Rostedt (Red Hat) 
153d6ca41d7SSteven Rostedt (Red Hat) 	return cnt;
154d6ca41d7SSteven Rostedt (Red Hat) }
155d6ca41d7SSteven Rostedt (Red Hat) 
sched_feat_open(struct inode * inode,struct file * filp)156d6ca41d7SSteven Rostedt (Red Hat) static int sched_feat_open(struct inode *inode, struct file *filp)
157d6ca41d7SSteven Rostedt (Red Hat) {
158d6ca41d7SSteven Rostedt (Red Hat) 	return single_open(filp, sched_feat_show, NULL);
159d6ca41d7SSteven Rostedt (Red Hat) }
160d6ca41d7SSteven Rostedt (Red Hat) 
161d6ca41d7SSteven Rostedt (Red Hat) static const struct file_operations sched_feat_fops = {
162d6ca41d7SSteven Rostedt (Red Hat) 	.open		= sched_feat_open,
163d6ca41d7SSteven Rostedt (Red Hat) 	.write		= sched_feat_write,
164d6ca41d7SSteven Rostedt (Red Hat) 	.read		= seq_read,
165d6ca41d7SSteven Rostedt (Red Hat) 	.llseek		= seq_lseek,
166d6ca41d7SSteven Rostedt (Red Hat) 	.release	= single_release,
167d6ca41d7SSteven Rostedt (Red Hat) };
168d6ca41d7SSteven Rostedt (Red Hat) 
1698a99b683SPeter Zijlstra #ifdef CONFIG_SMP
1708a99b683SPeter Zijlstra 
sched_scaling_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos)1718a99b683SPeter Zijlstra static ssize_t sched_scaling_write(struct file *filp, const char __user *ubuf,
1728a99b683SPeter Zijlstra 				   size_t cnt, loff_t *ppos)
1738a99b683SPeter Zijlstra {
1748a99b683SPeter Zijlstra 	char buf[16];
17570306618SMel Gorman 	unsigned int scaling;
1768a99b683SPeter Zijlstra 
1778a99b683SPeter Zijlstra 	if (cnt > 15)
1788a99b683SPeter Zijlstra 		cnt = 15;
1798a99b683SPeter Zijlstra 
1808a99b683SPeter Zijlstra 	if (copy_from_user(&buf, ubuf, cnt))
1818a99b683SPeter Zijlstra 		return -EFAULT;
18270306618SMel Gorman 	buf[cnt] = '\0';
1838a99b683SPeter Zijlstra 
18470306618SMel Gorman 	if (kstrtouint(buf, 10, &scaling))
1858a99b683SPeter Zijlstra 		return -EINVAL;
1868a99b683SPeter Zijlstra 
18770306618SMel Gorman 	if (scaling >= SCHED_TUNABLESCALING_END)
18870306618SMel Gorman 		return -EINVAL;
18970306618SMel Gorman 
19070306618SMel Gorman 	sysctl_sched_tunable_scaling = scaling;
1918a99b683SPeter Zijlstra 	if (sched_update_scaling())
1928a99b683SPeter Zijlstra 		return -EINVAL;
1938a99b683SPeter Zijlstra 
1948a99b683SPeter Zijlstra 	*ppos += cnt;
1958a99b683SPeter Zijlstra 	return cnt;
1968a99b683SPeter Zijlstra }
1978a99b683SPeter Zijlstra 
sched_scaling_show(struct seq_file * m,void * v)1988a99b683SPeter Zijlstra static int sched_scaling_show(struct seq_file *m, void *v)
1998a99b683SPeter Zijlstra {
2008a99b683SPeter Zijlstra 	seq_printf(m, "%d\n", sysctl_sched_tunable_scaling);
2018a99b683SPeter Zijlstra 	return 0;
2028a99b683SPeter Zijlstra }
2038a99b683SPeter Zijlstra 
sched_scaling_open(struct inode * inode,struct file * filp)2048a99b683SPeter Zijlstra static int sched_scaling_open(struct inode *inode, struct file *filp)
2058a99b683SPeter Zijlstra {
2068a99b683SPeter Zijlstra 	return single_open(filp, sched_scaling_show, NULL);
2078a99b683SPeter Zijlstra }
2088a99b683SPeter Zijlstra 
2098a99b683SPeter Zijlstra static const struct file_operations sched_scaling_fops = {
2108a99b683SPeter Zijlstra 	.open		= sched_scaling_open,
2118a99b683SPeter Zijlstra 	.write		= sched_scaling_write,
2128a99b683SPeter Zijlstra 	.read		= seq_read,
2138a99b683SPeter Zijlstra 	.llseek		= seq_lseek,
2148a99b683SPeter Zijlstra 	.release	= single_release,
2158a99b683SPeter Zijlstra };
2168a99b683SPeter Zijlstra 
2178a99b683SPeter Zijlstra #endif /* SMP */
2188a99b683SPeter Zijlstra 
2191011dcceSPeter Zijlstra #ifdef CONFIG_PREEMPT_DYNAMIC
2201011dcceSPeter Zijlstra 
sched_dynamic_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos)2211011dcceSPeter Zijlstra static ssize_t sched_dynamic_write(struct file *filp, const char __user *ubuf,
2221011dcceSPeter Zijlstra 				   size_t cnt, loff_t *ppos)
2231011dcceSPeter Zijlstra {
2241011dcceSPeter Zijlstra 	char buf[16];
2251011dcceSPeter Zijlstra 	int mode;
2261011dcceSPeter Zijlstra 
2271011dcceSPeter Zijlstra 	if (cnt > 15)
2281011dcceSPeter Zijlstra 		cnt = 15;
2291011dcceSPeter Zijlstra 
2301011dcceSPeter Zijlstra 	if (copy_from_user(&buf, ubuf, cnt))
2311011dcceSPeter Zijlstra 		return -EFAULT;
2321011dcceSPeter Zijlstra 
2331011dcceSPeter Zijlstra 	buf[cnt] = 0;
2341011dcceSPeter Zijlstra 	mode = sched_dynamic_mode(strstrip(buf));
2351011dcceSPeter Zijlstra 	if (mode < 0)
2361011dcceSPeter Zijlstra 		return mode;
2371011dcceSPeter Zijlstra 
2381011dcceSPeter Zijlstra 	sched_dynamic_update(mode);
2391011dcceSPeter Zijlstra 
2401011dcceSPeter Zijlstra 	*ppos += cnt;
2411011dcceSPeter Zijlstra 
2421011dcceSPeter Zijlstra 	return cnt;
2431011dcceSPeter Zijlstra }
2441011dcceSPeter Zijlstra 
sched_dynamic_show(struct seq_file * m,void * v)2451011dcceSPeter Zijlstra static int sched_dynamic_show(struct seq_file *m, void *v)
2461011dcceSPeter Zijlstra {
24735772d62SPeter Zijlstra 	int i = IS_ENABLED(CONFIG_PREEMPT_RT) * 2;
2488bdc5daaSSebastian Andrzej Siewior 	int j;
2498bdc5daaSSebastian Andrzej Siewior 
2508bdc5daaSSebastian Andrzej Siewior 	/* Count entries in NULL terminated preempt_modes */
2518bdc5daaSSebastian Andrzej Siewior 	for (j = 0; preempt_modes[j]; j++)
2528bdc5daaSSebastian Andrzej Siewior 		;
2538bdc5daaSSebastian Andrzej Siewior 	j -= !IS_ENABLED(CONFIG_ARCH_HAS_PREEMPT_LAZY);
2541011dcceSPeter Zijlstra 
25535772d62SPeter Zijlstra 	for (; i < j; i++) {
2561011dcceSPeter Zijlstra 		if (preempt_dynamic_mode == i)
2571011dcceSPeter Zijlstra 			seq_puts(m, "(");
2581011dcceSPeter Zijlstra 		seq_puts(m, preempt_modes[i]);
2591011dcceSPeter Zijlstra 		if (preempt_dynamic_mode == i)
2601011dcceSPeter Zijlstra 			seq_puts(m, ")");
2611011dcceSPeter Zijlstra 
2621011dcceSPeter Zijlstra 		seq_puts(m, " ");
2631011dcceSPeter Zijlstra 	}
2641011dcceSPeter Zijlstra 
2651011dcceSPeter Zijlstra 	seq_puts(m, "\n");
2661011dcceSPeter Zijlstra 	return 0;
2671011dcceSPeter Zijlstra }
2681011dcceSPeter Zijlstra 
sched_dynamic_open(struct inode * inode,struct file * filp)2691011dcceSPeter Zijlstra static int sched_dynamic_open(struct inode *inode, struct file *filp)
2701011dcceSPeter Zijlstra {
2711011dcceSPeter Zijlstra 	return single_open(filp, sched_dynamic_show, NULL);
2721011dcceSPeter Zijlstra }
2731011dcceSPeter Zijlstra 
2741011dcceSPeter Zijlstra static const struct file_operations sched_dynamic_fops = {
2751011dcceSPeter Zijlstra 	.open		= sched_dynamic_open,
2761011dcceSPeter Zijlstra 	.write		= sched_dynamic_write,
2771011dcceSPeter Zijlstra 	.read		= seq_read,
2781011dcceSPeter Zijlstra 	.llseek		= seq_lseek,
2791011dcceSPeter Zijlstra 	.release	= single_release,
2801011dcceSPeter Zijlstra };
2811011dcceSPeter Zijlstra 
2821011dcceSPeter Zijlstra #endif /* CONFIG_PREEMPT_DYNAMIC */
2831011dcceSPeter Zijlstra 
2849406415fSPeter Zijlstra __read_mostly bool sched_debug_verbose;
2859469eb01SPeter Zijlstra 
28634320745SPhil Auld #ifdef CONFIG_SMP
28734320745SPhil Auld static struct dentry           *sd_dentry;
28834320745SPhil Auld 
28934320745SPhil Auld 
sched_verbose_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos)29034320745SPhil Auld static ssize_t sched_verbose_write(struct file *filp, const char __user *ubuf,
29134320745SPhil Auld 				  size_t cnt, loff_t *ppos)
29234320745SPhil Auld {
29334320745SPhil Auld 	ssize_t result;
29434320745SPhil Auld 	bool orig;
29534320745SPhil Auld 
29634320745SPhil Auld 	cpus_read_lock();
297*56209334SJuri Lelli 	sched_domains_mutex_lock();
29834320745SPhil Auld 
29934320745SPhil Auld 	orig = sched_debug_verbose;
30034320745SPhil Auld 	result = debugfs_write_file_bool(filp, ubuf, cnt, ppos);
30134320745SPhil Auld 
30234320745SPhil Auld 	if (sched_debug_verbose && !orig)
30334320745SPhil Auld 		update_sched_domain_debugfs();
30434320745SPhil Auld 	else if (!sched_debug_verbose && orig) {
30534320745SPhil Auld 		debugfs_remove(sd_dentry);
30634320745SPhil Auld 		sd_dentry = NULL;
30734320745SPhil Auld 	}
30834320745SPhil Auld 
309*56209334SJuri Lelli 	sched_domains_mutex_unlock();
31034320745SPhil Auld 	cpus_read_unlock();
31134320745SPhil Auld 
31234320745SPhil Auld 	return result;
31334320745SPhil Auld }
31434320745SPhil Auld #else
31534320745SPhil Auld #define sched_verbose_write debugfs_write_file_bool
31634320745SPhil Auld #endif
31734320745SPhil Auld 
31834320745SPhil Auld static const struct file_operations sched_verbose_fops = {
31934320745SPhil Auld 	.read =         debugfs_read_file_bool,
32034320745SPhil Auld 	.write =        sched_verbose_write,
32134320745SPhil Auld 	.open =         simple_open,
32234320745SPhil Auld 	.llseek =       default_llseek,
32334320745SPhil Auld };
32434320745SPhil Auld 
325d27e9ae2SPeter Zijlstra static const struct seq_operations sched_debug_sops;
326d27e9ae2SPeter Zijlstra 
sched_debug_open(struct inode * inode,struct file * filp)327d27e9ae2SPeter Zijlstra static int sched_debug_open(struct inode *inode, struct file *filp)
328d27e9ae2SPeter Zijlstra {
329d27e9ae2SPeter Zijlstra 	return seq_open(filp, &sched_debug_sops);
330d27e9ae2SPeter Zijlstra }
331d27e9ae2SPeter Zijlstra 
332d27e9ae2SPeter Zijlstra static const struct file_operations sched_debug_fops = {
333d27e9ae2SPeter Zijlstra 	.open		= sched_debug_open,
334d27e9ae2SPeter Zijlstra 	.read		= seq_read,
335d27e9ae2SPeter Zijlstra 	.llseek		= seq_lseek,
336d27e9ae2SPeter Zijlstra 	.release	= seq_release,
337d27e9ae2SPeter Zijlstra };
338d27e9ae2SPeter Zijlstra 
339d741f297SDaniel Bristot de Oliveira enum dl_param {
340d741f297SDaniel Bristot de Oliveira 	DL_RUNTIME = 0,
341d741f297SDaniel Bristot de Oliveira 	DL_PERIOD,
342d741f297SDaniel Bristot de Oliveira };
343d741f297SDaniel Bristot de Oliveira 
3444ae0c2b9SDan Carpenter static unsigned long fair_server_period_max = (1UL << 22) * NSEC_PER_USEC; /* ~4 seconds */
345d741f297SDaniel Bristot de Oliveira static unsigned long fair_server_period_min = (100) * NSEC_PER_USEC;     /* 100 us */
346d741f297SDaniel Bristot de Oliveira 
sched_fair_server_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos,enum dl_param param)347d741f297SDaniel Bristot de Oliveira static ssize_t sched_fair_server_write(struct file *filp, const char __user *ubuf,
348d741f297SDaniel Bristot de Oliveira 				       size_t cnt, loff_t *ppos, enum dl_param param)
349d741f297SDaniel Bristot de Oliveira {
350d741f297SDaniel Bristot de Oliveira 	long cpu = (long) ((struct seq_file *) filp->private_data)->private;
351d741f297SDaniel Bristot de Oliveira 	struct rq *rq = cpu_rq(cpu);
352d741f297SDaniel Bristot de Oliveira 	u64 runtime, period;
353d741f297SDaniel Bristot de Oliveira 	size_t err;
354d741f297SDaniel Bristot de Oliveira 	int retval;
355d741f297SDaniel Bristot de Oliveira 	u64 value;
356d741f297SDaniel Bristot de Oliveira 
357d741f297SDaniel Bristot de Oliveira 	err = kstrtoull_from_user(ubuf, cnt, 10, &value);
358d741f297SDaniel Bristot de Oliveira 	if (err)
359d741f297SDaniel Bristot de Oliveira 		return err;
360d741f297SDaniel Bristot de Oliveira 
361d741f297SDaniel Bristot de Oliveira 	scoped_guard (rq_lock_irqsave, rq) {
362d741f297SDaniel Bristot de Oliveira 		runtime  = rq->fair_server.dl_runtime;
363d741f297SDaniel Bristot de Oliveira 		period = rq->fair_server.dl_period;
364d741f297SDaniel Bristot de Oliveira 
365d741f297SDaniel Bristot de Oliveira 		switch (param) {
366d741f297SDaniel Bristot de Oliveira 		case DL_RUNTIME:
367d741f297SDaniel Bristot de Oliveira 			if (runtime == value)
368d741f297SDaniel Bristot de Oliveira 				break;
369d741f297SDaniel Bristot de Oliveira 			runtime = value;
370d741f297SDaniel Bristot de Oliveira 			break;
371d741f297SDaniel Bristot de Oliveira 		case DL_PERIOD:
372d741f297SDaniel Bristot de Oliveira 			if (value == period)
373d741f297SDaniel Bristot de Oliveira 				break;
374d741f297SDaniel Bristot de Oliveira 			period = value;
375d741f297SDaniel Bristot de Oliveira 			break;
376d741f297SDaniel Bristot de Oliveira 		}
377d741f297SDaniel Bristot de Oliveira 
378d741f297SDaniel Bristot de Oliveira 		if (runtime > period ||
379d741f297SDaniel Bristot de Oliveira 		    period > fair_server_period_max ||
380d741f297SDaniel Bristot de Oliveira 		    period < fair_server_period_min) {
381d741f297SDaniel Bristot de Oliveira 			return  -EINVAL;
382d741f297SDaniel Bristot de Oliveira 		}
383d741f297SDaniel Bristot de Oliveira 
3847b8a702dSVincent Guittot 		if (rq->cfs.h_nr_queued) {
385d741f297SDaniel Bristot de Oliveira 			update_rq_clock(rq);
386d741f297SDaniel Bristot de Oliveira 			dl_server_stop(&rq->fair_server);
387d741f297SDaniel Bristot de Oliveira 		}
388d741f297SDaniel Bristot de Oliveira 
389d741f297SDaniel Bristot de Oliveira 		retval = dl_server_apply_params(&rq->fair_server, runtime, period, 0);
390d741f297SDaniel Bristot de Oliveira 		if (retval)
391d741f297SDaniel Bristot de Oliveira 			cnt = retval;
392d741f297SDaniel Bristot de Oliveira 
393d741f297SDaniel Bristot de Oliveira 		if (!runtime)
394d741f297SDaniel Bristot de Oliveira 			printk_deferred("Fair server disabled in CPU %d, system may crash due to starvation.\n",
395d741f297SDaniel Bristot de Oliveira 					cpu_of(rq));
396d741f297SDaniel Bristot de Oliveira 
3977b8a702dSVincent Guittot 		if (rq->cfs.h_nr_queued)
398d741f297SDaniel Bristot de Oliveira 			dl_server_start(&rq->fair_server);
399d741f297SDaniel Bristot de Oliveira 	}
400d741f297SDaniel Bristot de Oliveira 
401d741f297SDaniel Bristot de Oliveira 	*ppos += cnt;
402d741f297SDaniel Bristot de Oliveira 	return cnt;
403d741f297SDaniel Bristot de Oliveira }
404d741f297SDaniel Bristot de Oliveira 
sched_fair_server_show(struct seq_file * m,void * v,enum dl_param param)405d741f297SDaniel Bristot de Oliveira static size_t sched_fair_server_show(struct seq_file *m, void *v, enum dl_param param)
406d741f297SDaniel Bristot de Oliveira {
407d741f297SDaniel Bristot de Oliveira 	unsigned long cpu = (unsigned long) m->private;
408d741f297SDaniel Bristot de Oliveira 	struct rq *rq = cpu_rq(cpu);
409d741f297SDaniel Bristot de Oliveira 	u64 value;
410d741f297SDaniel Bristot de Oliveira 
411d741f297SDaniel Bristot de Oliveira 	switch (param) {
412d741f297SDaniel Bristot de Oliveira 	case DL_RUNTIME:
413d741f297SDaniel Bristot de Oliveira 		value = rq->fair_server.dl_runtime;
414d741f297SDaniel Bristot de Oliveira 		break;
415d741f297SDaniel Bristot de Oliveira 	case DL_PERIOD:
416d741f297SDaniel Bristot de Oliveira 		value = rq->fair_server.dl_period;
417d741f297SDaniel Bristot de Oliveira 		break;
418d741f297SDaniel Bristot de Oliveira 	}
419d741f297SDaniel Bristot de Oliveira 
420d741f297SDaniel Bristot de Oliveira 	seq_printf(m, "%llu\n", value);
421d741f297SDaniel Bristot de Oliveira 	return 0;
422d741f297SDaniel Bristot de Oliveira 
423d741f297SDaniel Bristot de Oliveira }
424d741f297SDaniel Bristot de Oliveira 
425d741f297SDaniel Bristot de Oliveira static ssize_t
sched_fair_server_runtime_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos)426d741f297SDaniel Bristot de Oliveira sched_fair_server_runtime_write(struct file *filp, const char __user *ubuf,
427d741f297SDaniel Bristot de Oliveira 				size_t cnt, loff_t *ppos)
428d741f297SDaniel Bristot de Oliveira {
429d741f297SDaniel Bristot de Oliveira 	return sched_fair_server_write(filp, ubuf, cnt, ppos, DL_RUNTIME);
430d741f297SDaniel Bristot de Oliveira }
431d741f297SDaniel Bristot de Oliveira 
sched_fair_server_runtime_show(struct seq_file * m,void * v)432d741f297SDaniel Bristot de Oliveira static int sched_fair_server_runtime_show(struct seq_file *m, void *v)
433d741f297SDaniel Bristot de Oliveira {
434d741f297SDaniel Bristot de Oliveira 	return sched_fair_server_show(m, v, DL_RUNTIME);
435d741f297SDaniel Bristot de Oliveira }
436d741f297SDaniel Bristot de Oliveira 
sched_fair_server_runtime_open(struct inode * inode,struct file * filp)437d741f297SDaniel Bristot de Oliveira static int sched_fair_server_runtime_open(struct inode *inode, struct file *filp)
438d741f297SDaniel Bristot de Oliveira {
439d741f297SDaniel Bristot de Oliveira 	return single_open(filp, sched_fair_server_runtime_show, inode->i_private);
440d741f297SDaniel Bristot de Oliveira }
441d741f297SDaniel Bristot de Oliveira 
442d741f297SDaniel Bristot de Oliveira static const struct file_operations fair_server_runtime_fops = {
443d741f297SDaniel Bristot de Oliveira 	.open		= sched_fair_server_runtime_open,
444d741f297SDaniel Bristot de Oliveira 	.write		= sched_fair_server_runtime_write,
445d741f297SDaniel Bristot de Oliveira 	.read		= seq_read,
446d741f297SDaniel Bristot de Oliveira 	.llseek		= seq_lseek,
447d741f297SDaniel Bristot de Oliveira 	.release	= single_release,
448d741f297SDaniel Bristot de Oliveira };
449d741f297SDaniel Bristot de Oliveira 
450d741f297SDaniel Bristot de Oliveira static ssize_t
sched_fair_server_period_write(struct file * filp,const char __user * ubuf,size_t cnt,loff_t * ppos)451d741f297SDaniel Bristot de Oliveira sched_fair_server_period_write(struct file *filp, const char __user *ubuf,
452d741f297SDaniel Bristot de Oliveira 			       size_t cnt, loff_t *ppos)
453d741f297SDaniel Bristot de Oliveira {
454d741f297SDaniel Bristot de Oliveira 	return sched_fair_server_write(filp, ubuf, cnt, ppos, DL_PERIOD);
455d741f297SDaniel Bristot de Oliveira }
456d741f297SDaniel Bristot de Oliveira 
sched_fair_server_period_show(struct seq_file * m,void * v)457d741f297SDaniel Bristot de Oliveira static int sched_fair_server_period_show(struct seq_file *m, void *v)
458d741f297SDaniel Bristot de Oliveira {
459d741f297SDaniel Bristot de Oliveira 	return sched_fair_server_show(m, v, DL_PERIOD);
460d741f297SDaniel Bristot de Oliveira }
461d741f297SDaniel Bristot de Oliveira 
sched_fair_server_period_open(struct inode * inode,struct file * filp)462d741f297SDaniel Bristot de Oliveira static int sched_fair_server_period_open(struct inode *inode, struct file *filp)
463d741f297SDaniel Bristot de Oliveira {
464d741f297SDaniel Bristot de Oliveira 	return single_open(filp, sched_fair_server_period_show, inode->i_private);
465d741f297SDaniel Bristot de Oliveira }
466d741f297SDaniel Bristot de Oliveira 
467d741f297SDaniel Bristot de Oliveira static const struct file_operations fair_server_period_fops = {
468d741f297SDaniel Bristot de Oliveira 	.open		= sched_fair_server_period_open,
469d741f297SDaniel Bristot de Oliveira 	.write		= sched_fair_server_period_write,
470d741f297SDaniel Bristot de Oliveira 	.read		= seq_read,
471d741f297SDaniel Bristot de Oliveira 	.llseek		= seq_lseek,
472d741f297SDaniel Bristot de Oliveira 	.release	= single_release,
473d741f297SDaniel Bristot de Oliveira };
474d741f297SDaniel Bristot de Oliveira 
4751011dcceSPeter Zijlstra static struct dentry *debugfs_sched;
4768a99b683SPeter Zijlstra 
debugfs_fair_server_init(void)477d741f297SDaniel Bristot de Oliveira static void debugfs_fair_server_init(void)
478d741f297SDaniel Bristot de Oliveira {
479d741f297SDaniel Bristot de Oliveira 	struct dentry *d_fair;
480d741f297SDaniel Bristot de Oliveira 	unsigned long cpu;
481d741f297SDaniel Bristot de Oliveira 
482d741f297SDaniel Bristot de Oliveira 	d_fair = debugfs_create_dir("fair_server", debugfs_sched);
483d741f297SDaniel Bristot de Oliveira 	if (!d_fair)
484d741f297SDaniel Bristot de Oliveira 		return;
485d741f297SDaniel Bristot de Oliveira 
486d741f297SDaniel Bristot de Oliveira 	for_each_possible_cpu(cpu) {
487d741f297SDaniel Bristot de Oliveira 		struct dentry *d_cpu;
488d741f297SDaniel Bristot de Oliveira 		char buf[32];
489d741f297SDaniel Bristot de Oliveira 
490d741f297SDaniel Bristot de Oliveira 		snprintf(buf, sizeof(buf), "cpu%lu", cpu);
491d741f297SDaniel Bristot de Oliveira 		d_cpu = debugfs_create_dir(buf, d_fair);
492d741f297SDaniel Bristot de Oliveira 
493d741f297SDaniel Bristot de Oliveira 		debugfs_create_file("runtime", 0644, d_cpu, (void *) cpu, &fair_server_runtime_fops);
494d741f297SDaniel Bristot de Oliveira 		debugfs_create_file("period", 0644, d_cpu, (void *) cpu, &fair_server_period_fops);
495d741f297SDaniel Bristot de Oliveira 	}
496d741f297SDaniel Bristot de Oliveira }
497d741f297SDaniel Bristot de Oliveira 
sched_init_debug(void)498d6ca41d7SSteven Rostedt (Red Hat) static __init int sched_init_debug(void)
499d6ca41d7SSteven Rostedt (Red Hat) {
5008a99b683SPeter Zijlstra 	struct dentry __maybe_unused *numa;
501d6ca41d7SSteven Rostedt (Red Hat) 
5028a99b683SPeter Zijlstra 	debugfs_sched = debugfs_create_dir("sched", NULL);
5038a99b683SPeter Zijlstra 
5048a99b683SPeter Zijlstra 	debugfs_create_file("features", 0644, debugfs_sched, NULL, &sched_feat_fops);
50534320745SPhil Auld 	debugfs_create_file_unsafe("verbose", 0644, debugfs_sched, &sched_debug_verbose, &sched_verbose_fops);
5061011dcceSPeter Zijlstra #ifdef CONFIG_PREEMPT_DYNAMIC
5071011dcceSPeter Zijlstra 	debugfs_create_file("preempt", 0644, debugfs_sched, NULL, &sched_dynamic_fops);
5081011dcceSPeter Zijlstra #endif
5098a99b683SPeter Zijlstra 
510e4ec3318SPeter Zijlstra 	debugfs_create_u32("base_slice_ns", 0644, debugfs_sched, &sysctl_sched_base_slice);
5118a99b683SPeter Zijlstra 
512c006fac5SPaul Turner 	debugfs_create_u32("latency_warn_ms", 0644, debugfs_sched, &sysctl_resched_latency_warn_ms);
513c006fac5SPaul Turner 	debugfs_create_u32("latency_warn_once", 0644, debugfs_sched, &sysctl_resched_latency_warn_once);
514c006fac5SPaul Turner 
5158a99b683SPeter Zijlstra #ifdef CONFIG_SMP
5168a99b683SPeter Zijlstra 	debugfs_create_file("tunable_scaling", 0644, debugfs_sched, NULL, &sched_scaling_fops);
5178a99b683SPeter Zijlstra 	debugfs_create_u32("migration_cost_ns", 0644, debugfs_sched, &sysctl_sched_migration_cost);
5188a99b683SPeter Zijlstra 	debugfs_create_u32("nr_migrate", 0644, debugfs_sched, &sysctl_sched_nr_migrate);
5193b87f136SPeter Zijlstra 
520*56209334SJuri Lelli 	sched_domains_mutex_lock();
5213b87f136SPeter Zijlstra 	update_sched_domain_debugfs();
522*56209334SJuri Lelli 	sched_domains_mutex_unlock();
5238a99b683SPeter Zijlstra #endif
5248a99b683SPeter Zijlstra 
5258a99b683SPeter Zijlstra #ifdef CONFIG_NUMA_BALANCING
5268a99b683SPeter Zijlstra 	numa = debugfs_create_dir("numa_balancing", debugfs_sched);
5278a99b683SPeter Zijlstra 
5288a99b683SPeter Zijlstra 	debugfs_create_u32("scan_delay_ms", 0644, numa, &sysctl_numa_balancing_scan_delay);
5298a99b683SPeter Zijlstra 	debugfs_create_u32("scan_period_min_ms", 0644, numa, &sysctl_numa_balancing_scan_period_min);
5308a99b683SPeter Zijlstra 	debugfs_create_u32("scan_period_max_ms", 0644, numa, &sysctl_numa_balancing_scan_period_max);
5318a99b683SPeter Zijlstra 	debugfs_create_u32("scan_size_mb", 0644, numa, &sysctl_numa_balancing_scan_size);
53233024536SHuang Ying 	debugfs_create_u32("hot_threshold_ms", 0644, numa, &sysctl_numa_balancing_hot_threshold);
5338a99b683SPeter Zijlstra #endif
5349469eb01SPeter Zijlstra 
535d27e9ae2SPeter Zijlstra 	debugfs_create_file("debug", 0444, debugfs_sched, NULL, &sched_debug_fops);
536d27e9ae2SPeter Zijlstra 
537d741f297SDaniel Bristot de Oliveira 	debugfs_fair_server_init();
538d741f297SDaniel Bristot de Oliveira 
539d6ca41d7SSteven Rostedt (Red Hat) 	return 0;
540d6ca41d7SSteven Rostedt (Red Hat) }
541d6ca41d7SSteven Rostedt (Red Hat) late_initcall(sched_init_debug);
542d6ca41d7SSteven Rostedt (Red Hat) 
5433866e845SSteven Rostedt (Red Hat) #ifdef CONFIG_SMP
5443866e845SSteven Rostedt (Red Hat) 
5453b87f136SPeter Zijlstra static cpumask_var_t		sd_sysctl_cpus;
5463866e845SSteven Rostedt (Red Hat) 
sd_flags_show(struct seq_file * m,void * v)5473b87f136SPeter Zijlstra static int sd_flags_show(struct seq_file *m, void *v)
5483866e845SSteven Rostedt (Red Hat) {
5493b87f136SPeter Zijlstra 	unsigned long flags = *(unsigned int *)m->private;
5505b9f8ff7SValentin Schneider 	int idx;
5515b9f8ff7SValentin Schneider 
5525b9f8ff7SValentin Schneider 	for_each_set_bit(idx, &flags, __SD_FLAG_CNT) {
5533b87f136SPeter Zijlstra 		seq_puts(m, sd_flag_debug[idx].name);
5543b87f136SPeter Zijlstra 		seq_puts(m, " ");
5555b9f8ff7SValentin Schneider 	}
5563b87f136SPeter Zijlstra 	seq_puts(m, "\n");
5575b9f8ff7SValentin Schneider 
5585b9f8ff7SValentin Schneider 	return 0;
5595b9f8ff7SValentin Schneider }
5605b9f8ff7SValentin Schneider 
sd_flags_open(struct inode * inode,struct file * file)5613b87f136SPeter Zijlstra static int sd_flags_open(struct inode *inode, struct file *file)
5623866e845SSteven Rostedt (Red Hat) {
5633b87f136SPeter Zijlstra 	return single_open(file, sd_flags_show, inode->i_private);
5643866e845SSteven Rostedt (Red Hat) }
5653866e845SSteven Rostedt (Red Hat) 
5663b87f136SPeter Zijlstra static const struct file_operations sd_flags_fops = {
5673b87f136SPeter Zijlstra 	.open		= sd_flags_open,
5683b87f136SPeter Zijlstra 	.read		= seq_read,
5693b87f136SPeter Zijlstra 	.llseek		= seq_lseek,
5703b87f136SPeter Zijlstra 	.release	= single_release,
5713b87f136SPeter Zijlstra };
5723b87f136SPeter Zijlstra 
register_sd(struct sched_domain * sd,struct dentry * parent)5733b87f136SPeter Zijlstra static void register_sd(struct sched_domain *sd, struct dentry *parent)
5743866e845SSteven Rostedt (Red Hat) {
5753b87f136SPeter Zijlstra #define SDM(type, mode, member)	\
5763b87f136SPeter Zijlstra 	debugfs_create_##type(#member, mode, parent, &sd->member)
5773866e845SSteven Rostedt (Red Hat) 
5783b87f136SPeter Zijlstra 	SDM(ulong, 0644, min_interval);
5793b87f136SPeter Zijlstra 	SDM(ulong, 0644, max_interval);
5803b87f136SPeter Zijlstra 	SDM(u64,   0644, max_newidle_lb_cost);
5813b87f136SPeter Zijlstra 	SDM(u32,   0644, busy_factor);
5823b87f136SPeter Zijlstra 	SDM(u32,   0644, imbalance_pct);
5833b87f136SPeter Zijlstra 	SDM(u32,   0644, cache_nice_tries);
5843b87f136SPeter Zijlstra 	SDM(str,   0444, name);
5853866e845SSteven Rostedt (Red Hat) 
5863b87f136SPeter Zijlstra #undef SDM
5873b87f136SPeter Zijlstra 
5883b87f136SPeter Zijlstra 	debugfs_create_file("flags", 0444, parent, &sd->flags, &sd_flags_fops);
589ed74cc49SPeter Zijlstra 	debugfs_create_file("groups_flags", 0444, parent, &sd->groups->flags, &sd_flags_fops);
590287372faSVitalii Bursov 	debugfs_create_u32("level", 0444, parent, (u32 *)&sd->level);
5913866e845SSteven Rostedt (Red Hat) }
5923866e845SSteven Rostedt (Red Hat) 
update_sched_domain_debugfs(void)5933b87f136SPeter Zijlstra void update_sched_domain_debugfs(void)
5943866e845SSteven Rostedt (Red Hat) {
5953b87f136SPeter Zijlstra 	int cpu, i;
596bbdacdfeSPeter Zijlstra 
597459b09b5SValentin Schneider 	/*
598459b09b5SValentin Schneider 	 * This can unfortunately be invoked before sched_debug_init() creates
599459b09b5SValentin Schneider 	 * the debug directory. Don't touch sd_sysctl_cpus until then.
600459b09b5SValentin Schneider 	 */
601459b09b5SValentin Schneider 	if (!debugfs_sched)
602459b09b5SValentin Schneider 		return;
603459b09b5SValentin Schneider 
60434320745SPhil Auld 	if (!sched_debug_verbose)
60534320745SPhil Auld 		return;
60634320745SPhil Auld 
607bbdacdfeSPeter Zijlstra 	if (!cpumask_available(sd_sysctl_cpus)) {
608bbdacdfeSPeter Zijlstra 		if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL))
609bbdacdfeSPeter Zijlstra 			return;
610bbdacdfeSPeter Zijlstra 		cpumask_copy(sd_sysctl_cpus, cpu_possible_mask);
611bbdacdfeSPeter Zijlstra 	}
612bbdacdfeSPeter Zijlstra 
61334320745SPhil Auld 	if (!sd_dentry) {
6143b87f136SPeter Zijlstra 		sd_dentry = debugfs_create_dir("domains", debugfs_sched);
615bbdacdfeSPeter Zijlstra 
61634320745SPhil Auld 		/* rebuild sd_sysctl_cpus if empty since it gets cleared below */
61734320745SPhil Auld 		if (cpumask_empty(sd_sysctl_cpus))
61834320745SPhil Auld 			cpumask_copy(sd_sysctl_cpus, cpu_online_mask);
61934320745SPhil Auld 	}
62034320745SPhil Auld 
6213b87f136SPeter Zijlstra 	for_each_cpu(cpu, sd_sysctl_cpus) {
6223b87f136SPeter Zijlstra 		struct sched_domain *sd;
6233b87f136SPeter Zijlstra 		struct dentry *d_cpu;
6243b87f136SPeter Zijlstra 		char buf[32];
625bbdacdfeSPeter Zijlstra 
6263b87f136SPeter Zijlstra 		snprintf(buf, sizeof(buf), "cpu%d", cpu);
627c2e40659SGreg Kroah-Hartman 		debugfs_lookup_and_remove(buf, sd_dentry);
6283b87f136SPeter Zijlstra 		d_cpu = debugfs_create_dir(buf, sd_dentry);
629bbdacdfeSPeter Zijlstra 
6303b87f136SPeter Zijlstra 		i = 0;
6313b87f136SPeter Zijlstra 		for_each_domain(cpu, sd) {
6323b87f136SPeter Zijlstra 			struct dentry *d_sd;
6333b87f136SPeter Zijlstra 
6343b87f136SPeter Zijlstra 			snprintf(buf, sizeof(buf), "domain%d", i);
6353b87f136SPeter Zijlstra 			d_sd = debugfs_create_dir(buf, d_cpu);
6363b87f136SPeter Zijlstra 
6373b87f136SPeter Zijlstra 			register_sd(sd, d_sd);
6383b87f136SPeter Zijlstra 			i++;
6393866e845SSteven Rostedt (Red Hat) 		}
6403866e845SSteven Rostedt (Red Hat) 
6413b87f136SPeter Zijlstra 		__cpumask_clear_cpu(cpu, sd_sysctl_cpus);
6423b87f136SPeter Zijlstra 	}
6433866e845SSteven Rostedt (Red Hat) }
6443866e845SSteven Rostedt (Red Hat) 
dirty_sched_domain_sysctl(int cpu)645bbdacdfeSPeter Zijlstra void dirty_sched_domain_sysctl(int cpu)
646bbdacdfeSPeter Zijlstra {
647bbdacdfeSPeter Zijlstra 	if (cpumask_available(sd_sysctl_cpus))
648bbdacdfeSPeter Zijlstra 		__cpumask_set_cpu(cpu, sd_sysctl_cpus);
649bbdacdfeSPeter Zijlstra }
650bbdacdfeSPeter Zijlstra 
6513866e845SSteven Rostedt (Red Hat) #endif /* CONFIG_SMP */
6523866e845SSteven Rostedt (Red Hat) 
653391e43daSPeter Zijlstra #ifdef CONFIG_FAIR_GROUP_SCHED
print_cfs_group_stats(struct seq_file * m,int cpu,struct task_group * tg)654391e43daSPeter Zijlstra static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_group *tg)
655391e43daSPeter Zijlstra {
656391e43daSPeter Zijlstra 	struct sched_entity *se = tg->se[cpu];
657391e43daSPeter Zijlstra 
65897fb7a0aSIngo Molnar #define P(F)		SEQ_printf(m, "  .%-30s: %lld\n",	#F, (long long)F)
659ceeadb83SYafang Shao #define P_SCHEDSTAT(F)	SEQ_printf(m, "  .%-30s: %lld\n",	\
660ceeadb83SYafang Shao 		#F, (long long)schedstat_val(stats->F))
66197fb7a0aSIngo Molnar #define PN(F)		SEQ_printf(m, "  .%-30s: %lld.%06ld\n", #F, SPLIT_NS((long long)F))
662ceeadb83SYafang Shao #define PN_SCHEDSTAT(F)	SEQ_printf(m, "  .%-30s: %lld.%06ld\n", \
663ceeadb83SYafang Shao 		#F, SPLIT_NS((long long)schedstat_val(stats->F)))
664391e43daSPeter Zijlstra 
665cd126afeSYuyang Du 	if (!se)
66618bf2805SBen Segall 		return;
66718bf2805SBen Segall 
668391e43daSPeter Zijlstra 	PN(se->exec_start);
669391e43daSPeter Zijlstra 	PN(se->vruntime);
670391e43daSPeter Zijlstra 	PN(se->sum_exec_runtime);
67197fb7a0aSIngo Molnar 
672cb251765SMel Gorman 	if (schedstat_enabled()) {
673769fdf83SPeter Zijlstra 		struct sched_statistics *stats;
674769fdf83SPeter Zijlstra 		stats = __schedstats_from_se(se);
675ceeadb83SYafang Shao 
676ceeadb83SYafang Shao 		PN_SCHEDSTAT(wait_start);
677ceeadb83SYafang Shao 		PN_SCHEDSTAT(sleep_start);
678ceeadb83SYafang Shao 		PN_SCHEDSTAT(block_start);
679ceeadb83SYafang Shao 		PN_SCHEDSTAT(sleep_max);
680ceeadb83SYafang Shao 		PN_SCHEDSTAT(block_max);
681ceeadb83SYafang Shao 		PN_SCHEDSTAT(exec_max);
682ceeadb83SYafang Shao 		PN_SCHEDSTAT(slice_max);
683ceeadb83SYafang Shao 		PN_SCHEDSTAT(wait_max);
684ceeadb83SYafang Shao 		PN_SCHEDSTAT(wait_sum);
685ceeadb83SYafang Shao 		P_SCHEDSTAT(wait_count);
686cb251765SMel Gorman 	}
68797fb7a0aSIngo Molnar 
688391e43daSPeter Zijlstra 	P(se->load.weight);
6899d85f21cSPaul Turner #ifdef CONFIG_SMP
6909d89c257SYuyang Du 	P(se->avg.load_avg);
6919d89c257SYuyang Du 	P(se->avg.util_avg);
6929f683953SVincent Guittot 	P(se->avg.runnable_avg);
6939d85f21cSPaul Turner #endif
6944fa8d299SJosh Poimboeuf 
6954fa8d299SJosh Poimboeuf #undef PN_SCHEDSTAT
696391e43daSPeter Zijlstra #undef PN
6974fa8d299SJosh Poimboeuf #undef P_SCHEDSTAT
698391e43daSPeter Zijlstra #undef P
699391e43daSPeter Zijlstra }
700391e43daSPeter Zijlstra #endif
701391e43daSPeter Zijlstra 
702391e43daSPeter Zijlstra #ifdef CONFIG_CGROUP_SCHED
703ad789f84SWaiman Long static DEFINE_SPINLOCK(sched_debug_lock);
704391e43daSPeter Zijlstra static char group_path[PATH_MAX];
705391e43daSPeter Zijlstra 
task_group_path(struct task_group * tg,char * path,int plen)706ad789f84SWaiman Long static void task_group_path(struct task_group *tg, char *path, int plen)
707391e43daSPeter Zijlstra {
708ad789f84SWaiman Long 	if (autogroup_path(tg, path, plen))
709ad789f84SWaiman Long 		return;
710391e43daSPeter Zijlstra 
711ad789f84SWaiman Long 	cgroup_path(tg->css.cgroup, path, plen);
712ad789f84SWaiman Long }
71397fb7a0aSIngo Molnar 
714ad789f84SWaiman Long /*
715ad789f84SWaiman Long  * Only 1 SEQ_printf_task_group_path() caller can use the full length
716ad789f84SWaiman Long  * group_path[] for cgroup path. Other simultaneous callers will have
717ad789f84SWaiman Long  * to use a shorter stack buffer. A "..." suffix is appended at the end
718ad789f84SWaiman Long  * of the stack buffer so that it will show up in case the output length
719ad789f84SWaiman Long  * matches the given buffer size to indicate possible path name truncation.
720ad789f84SWaiman Long  */
721ad789f84SWaiman Long #define SEQ_printf_task_group_path(m, tg, fmt...)			\
722ad789f84SWaiman Long {									\
723ad789f84SWaiman Long 	if (spin_trylock(&sched_debug_lock)) {				\
724ad789f84SWaiman Long 		task_group_path(tg, group_path, sizeof(group_path));	\
725ad789f84SWaiman Long 		SEQ_printf(m, fmt, group_path);				\
726ad789f84SWaiman Long 		spin_unlock(&sched_debug_lock);				\
727ad789f84SWaiman Long 	} else {							\
728ad789f84SWaiman Long 		char buf[128];						\
729ad789f84SWaiman Long 		char *bufend = buf + sizeof(buf) - 3;			\
730ad789f84SWaiman Long 		task_group_path(tg, buf, bufend - buf);			\
731ad789f84SWaiman Long 		strcpy(bufend - 1, "...");				\
732ad789f84SWaiman Long 		SEQ_printf(m, fmt, buf);				\
733ad789f84SWaiman Long 	}								\
734391e43daSPeter Zijlstra }
735391e43daSPeter Zijlstra #endif
736391e43daSPeter Zijlstra 
737391e43daSPeter Zijlstra static void
print_task(struct seq_file * m,struct rq * rq,struct task_struct * p)738391e43daSPeter Zijlstra print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
739391e43daSPeter Zijlstra {
74065bcf072SHui Su 	if (task_current(rq, p))
741e8c16495SXie XiuQi 		SEQ_printf(m, ">R");
74220435d84SXie XiuQi 	else
74320435d84SXie XiuQi 		SEQ_printf(m, " %c", task_state_to_char(p));
744391e43daSPeter Zijlstra 
745857b158dSPeter Zijlstra 	SEQ_printf(m, " %15s %5d %9Ld.%06ld   %c   %9Ld.%06ld %c %9Ld.%06ld %9Ld.%06ld %9Ld   %5d ",
746fc840914SPeter Zijlstra 		p->comm, task_pid_nr(p),
747391e43daSPeter Zijlstra 		SPLIT_NS(p->se.vruntime),
748147f3efaSPeter Zijlstra 		entity_eligible(cfs_rq_of(&p->se), &p->se) ? 'E' : 'N',
749147f3efaSPeter Zijlstra 		SPLIT_NS(p->se.deadline),
750857b158dSPeter Zijlstra 		p->se.custom_slice ? 'S' : ' ',
751147f3efaSPeter Zijlstra 		SPLIT_NS(p->se.slice),
752147f3efaSPeter Zijlstra 		SPLIT_NS(p->se.sum_exec_runtime),
753391e43daSPeter Zijlstra 		(long long)(p->nvcsw + p->nivcsw),
754391e43daSPeter Zijlstra 		p->prio);
7559c572591SJosh Poimboeuf 
7562cab4bd0SHuang Shijie 	SEQ_printf(m, "%9lld.%06ld %9lld.%06ld %9lld.%06ld",
757ceeadb83SYafang Shao 		SPLIT_NS(schedstat_val_or_zero(p->stats.wait_sum)),
758847fc0cdSYafang Shao 		SPLIT_NS(schedstat_val_or_zero(p->stats.sum_sleep_runtime)),
759847fc0cdSYafang Shao 		SPLIT_NS(schedstat_val_or_zero(p->stats.sum_block_runtime)));
7609c572591SJosh Poimboeuf 
761b32e86b4SIngo Molnar #ifdef CONFIG_NUMA_BALANCING
762e3d24d0aSSrikar Dronamraju 	SEQ_printf(m, "   %d      %d", task_node(p), task_numa_group_id(p));
763b32e86b4SIngo Molnar #endif
764391e43daSPeter Zijlstra #ifdef CONFIG_CGROUP_SCHED
765ad789f84SWaiman Long 	SEQ_printf_task_group_path(m, task_group(p), "        %s")
766391e43daSPeter Zijlstra #endif
767391e43daSPeter Zijlstra 
768391e43daSPeter Zijlstra 	SEQ_printf(m, "\n");
769391e43daSPeter Zijlstra }
770391e43daSPeter Zijlstra 
print_rq(struct seq_file * m,struct rq * rq,int rq_cpu)771391e43daSPeter Zijlstra static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
772391e43daSPeter Zijlstra {
773391e43daSPeter Zijlstra 	struct task_struct *g, *p;
774391e43daSPeter Zijlstra 
775e9ca2670SJoe Lawrence 	SEQ_printf(m, "\n");
776e9ca2670SJoe Lawrence 	SEQ_printf(m, "runnable tasks:\n");
7772cab4bd0SHuang Shijie 	SEQ_printf(m, " S            task   PID       vruntime   eligible    "
7782cab4bd0SHuang Shijie 		   "deadline             slice          sum-exec      switches  "
7792cab4bd0SHuang Shijie 		   "prio         wait-time        sum-sleep       sum-block"
7802cab4bd0SHuang Shijie #ifdef CONFIG_NUMA_BALANCING
7812cab4bd0SHuang Shijie 		   "  node   group-id"
7822cab4bd0SHuang Shijie #endif
7832cab4bd0SHuang Shijie #ifdef CONFIG_CGROUP_SCHED
7842cab4bd0SHuang Shijie 		   "  group-path"
7852cab4bd0SHuang Shijie #endif
7862cab4bd0SHuang Shijie 		   "\n");
787e9ca2670SJoe Lawrence 	SEQ_printf(m, "-------------------------------------------------------"
7882cab4bd0SHuang Shijie 		   "------------------------------------------------------"
7892cab4bd0SHuang Shijie 		   "------------------------------------------------------"
7902cab4bd0SHuang Shijie #ifdef CONFIG_NUMA_BALANCING
7912cab4bd0SHuang Shijie 		   "--------------"
7922cab4bd0SHuang Shijie #endif
7932cab4bd0SHuang Shijie #ifdef CONFIG_CGROUP_SCHED
7942cab4bd0SHuang Shijie 		   "--------------"
7952cab4bd0SHuang Shijie #endif
7962cab4bd0SHuang Shijie 		   "\n");
797391e43daSPeter Zijlstra 
7985bd96ab6SOleg Nesterov 	rcu_read_lock();
799d38e83c7SOleg Nesterov 	for_each_process_thread(g, p) {
800b32e86b4SIngo Molnar 		if (task_cpu(p) != rq_cpu)
801391e43daSPeter Zijlstra 			continue;
802391e43daSPeter Zijlstra 
803391e43daSPeter Zijlstra 		print_task(m, rq, p);
804d38e83c7SOleg Nesterov 	}
8055bd96ab6SOleg Nesterov 	rcu_read_unlock();
806391e43daSPeter Zijlstra }
807391e43daSPeter Zijlstra 
print_cfs_rq(struct seq_file * m,int cpu,struct cfs_rq * cfs_rq)808391e43daSPeter Zijlstra void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
809391e43daSPeter Zijlstra {
8102227a957SAbel Wu 	s64 left_vruntime = -1, min_vruntime, right_vruntime = -1, left_deadline = -1, spread;
8112227a957SAbel Wu 	struct sched_entity *last, *first, *root;
812391e43daSPeter Zijlstra 	struct rq *rq = cpu_rq(cpu);
813391e43daSPeter Zijlstra 	unsigned long flags;
814391e43daSPeter Zijlstra 
815391e43daSPeter Zijlstra #ifdef CONFIG_FAIR_GROUP_SCHED
816e9ca2670SJoe Lawrence 	SEQ_printf(m, "\n");
817ad789f84SWaiman Long 	SEQ_printf_task_group_path(m, cfs_rq->tg, "cfs_rq[%d]:%s\n", cpu);
818391e43daSPeter Zijlstra #else
819e9ca2670SJoe Lawrence 	SEQ_printf(m, "\n");
820e9ca2670SJoe Lawrence 	SEQ_printf(m, "cfs_rq[%d]:\n", cpu);
821391e43daSPeter Zijlstra #endif
822391e43daSPeter Zijlstra 
8235cb9eaa3SPeter Zijlstra 	raw_spin_rq_lock_irqsave(rq, flags);
8242227a957SAbel Wu 	root = __pick_root_entity(cfs_rq);
8252227a957SAbel Wu 	if (root)
8262227a957SAbel Wu 		left_vruntime = root->min_vruntime;
827af4cf404SPeter Zijlstra 	first = __pick_first_entity(cfs_rq);
828af4cf404SPeter Zijlstra 	if (first)
8292227a957SAbel Wu 		left_deadline = first->deadline;
830391e43daSPeter Zijlstra 	last = __pick_last_entity(cfs_rq);
831391e43daSPeter Zijlstra 	if (last)
832af4cf404SPeter Zijlstra 		right_vruntime = last->vruntime;
833391e43daSPeter Zijlstra 	min_vruntime = cfs_rq->min_vruntime;
8345cb9eaa3SPeter Zijlstra 	raw_spin_rq_unlock_irqrestore(rq, flags);
835af4cf404SPeter Zijlstra 
8362227a957SAbel Wu 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", "left_deadline",
8372227a957SAbel Wu 			SPLIT_NS(left_deadline));
838af4cf404SPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", "left_vruntime",
839af4cf404SPeter Zijlstra 			SPLIT_NS(left_vruntime));
840391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", "min_vruntime",
841391e43daSPeter Zijlstra 			SPLIT_NS(min_vruntime));
842af4cf404SPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", "avg_vruntime",
843af4cf404SPeter Zijlstra 			SPLIT_NS(avg_vruntime(cfs_rq)));
844af4cf404SPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", "right_vruntime",
845af4cf404SPeter Zijlstra 			SPLIT_NS(right_vruntime));
846af4cf404SPeter Zijlstra 	spread = right_vruntime - left_vruntime;
847af4cf404SPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", "spread", SPLIT_NS(spread));
848736c55a0SVincent Guittot 	SEQ_printf(m, "  .%-30s: %d\n", "nr_queued", cfs_rq->nr_queued);
849c2a295bfSVincent Guittot 	SEQ_printf(m, "  .%-30s: %d\n", "h_nr_runnable", cfs_rq->h_nr_runnable);
8507b8a702dSVincent Guittot 	SEQ_printf(m, "  .%-30s: %d\n", "h_nr_queued", cfs_rq->h_nr_queued);
85131898e7bSVincent Guittot 	SEQ_printf(m, "  .%-30s: %d\n", "h_nr_idle", cfs_rq->h_nr_idle);
852391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %ld\n", "load", cfs_rq->load.weight);
853391e43daSPeter Zijlstra #ifdef CONFIG_SMP
8549d89c257SYuyang Du 	SEQ_printf(m, "  .%-30s: %lu\n", "load_avg",
8559d89c257SYuyang Du 			cfs_rq->avg.load_avg);
8569f683953SVincent Guittot 	SEQ_printf(m, "  .%-30s: %lu\n", "runnable_avg",
8579f683953SVincent Guittot 			cfs_rq->avg.runnable_avg);
8589d89c257SYuyang Du 	SEQ_printf(m, "  .%-30s: %lu\n", "util_avg",
8599d89c257SYuyang Du 			cfs_rq->avg.util_avg);
86011137d38SVincent Guittot 	SEQ_printf(m, "  .%-30s: %u\n", "util_est",
86111137d38SVincent Guittot 			cfs_rq->avg.util_est);
8622a2f5d4eSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %ld\n", "removed.load_avg",
8632a2f5d4eSPeter Zijlstra 			cfs_rq->removed.load_avg);
8642a2f5d4eSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %ld\n", "removed.util_avg",
8652a2f5d4eSPeter Zijlstra 			cfs_rq->removed.util_avg);
8669f683953SVincent Guittot 	SEQ_printf(m, "  .%-30s: %ld\n", "removed.runnable_avg",
8679f683953SVincent Guittot 			cfs_rq->removed.runnable_avg);
868333bb864SAlex Shi #ifdef CONFIG_FAIR_GROUP_SCHED
8699d89c257SYuyang Du 	SEQ_printf(m, "  .%-30s: %lu\n", "tg_load_avg_contrib",
8709d89c257SYuyang Du 			cfs_rq->tg_load_avg_contrib);
871333bb864SAlex Shi 	SEQ_printf(m, "  .%-30s: %ld\n", "tg_load_avg",
872333bb864SAlex Shi 			atomic_long_read(&cfs_rq->tg->load_avg));
873391e43daSPeter Zijlstra #endif
874333bb864SAlex Shi #endif
875f9f9ffc2SBen Segall #ifdef CONFIG_CFS_BANDWIDTH
876f9f9ffc2SBen Segall 	SEQ_printf(m, "  .%-30s: %d\n", "throttled",
877f9f9ffc2SBen Segall 			cfs_rq->throttled);
878f9f9ffc2SBen Segall 	SEQ_printf(m, "  .%-30s: %d\n", "throttle_count",
879f9f9ffc2SBen Segall 			cfs_rq->throttle_count);
880f9f9ffc2SBen Segall #endif
881391e43daSPeter Zijlstra 
882333bb864SAlex Shi #ifdef CONFIG_FAIR_GROUP_SCHED
883391e43daSPeter Zijlstra 	print_cfs_group_stats(m, cpu, cfs_rq->tg);
884391e43daSPeter Zijlstra #endif
885391e43daSPeter Zijlstra }
886391e43daSPeter Zijlstra 
print_rt_rq(struct seq_file * m,int cpu,struct rt_rq * rt_rq)887391e43daSPeter Zijlstra void print_rt_rq(struct seq_file *m, int cpu, struct rt_rq *rt_rq)
888391e43daSPeter Zijlstra {
889391e43daSPeter Zijlstra #ifdef CONFIG_RT_GROUP_SCHED
890e9ca2670SJoe Lawrence 	SEQ_printf(m, "\n");
891ad789f84SWaiman Long 	SEQ_printf_task_group_path(m, rt_rq->tg, "rt_rq[%d]:%s\n", cpu);
892391e43daSPeter Zijlstra #else
893e9ca2670SJoe Lawrence 	SEQ_printf(m, "\n");
894e9ca2670SJoe Lawrence 	SEQ_printf(m, "rt_rq[%d]:\n", cpu);
895391e43daSPeter Zijlstra #endif
896391e43daSPeter Zijlstra 
897391e43daSPeter Zijlstra #define P(x) \
898391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld\n", #x, (long long)(rt_rq->x))
89948365b38SDaniel Bristot de Oliveira #define PU(x) \
90048365b38SDaniel Bristot de Oliveira 	SEQ_printf(m, "  .%-30s: %lu\n", #x, (unsigned long)(rt_rq->x))
901391e43daSPeter Zijlstra #define PN(x) \
902391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", #x, SPLIT_NS(rt_rq->x))
903391e43daSPeter Zijlstra 
90448365b38SDaniel Bristot de Oliveira 	PU(rt_nr_running);
9055f6bd380SPeter Zijlstra 
9065f6bd380SPeter Zijlstra #ifdef CONFIG_RT_GROUP_SCHED
907391e43daSPeter Zijlstra 	P(rt_throttled);
908391e43daSPeter Zijlstra 	PN(rt_time);
909391e43daSPeter Zijlstra 	PN(rt_runtime);
9105f6bd380SPeter Zijlstra #endif
911391e43daSPeter Zijlstra 
912391e43daSPeter Zijlstra #undef PN
91348365b38SDaniel Bristot de Oliveira #undef PU
914391e43daSPeter Zijlstra #undef P
915391e43daSPeter Zijlstra }
916391e43daSPeter Zijlstra 
print_dl_rq(struct seq_file * m,int cpu,struct dl_rq * dl_rq)917acb32132SWanpeng Li void print_dl_rq(struct seq_file *m, int cpu, struct dl_rq *dl_rq)
918acb32132SWanpeng Li {
919ef477183SSteven Rostedt (Red Hat) 	struct dl_bw *dl_bw;
920ef477183SSteven Rostedt (Red Hat) 
921e9ca2670SJoe Lawrence 	SEQ_printf(m, "\n");
922e9ca2670SJoe Lawrence 	SEQ_printf(m, "dl_rq[%d]:\n", cpu);
92348365b38SDaniel Bristot de Oliveira 
92448365b38SDaniel Bristot de Oliveira #define PU(x) \
92548365b38SDaniel Bristot de Oliveira 	SEQ_printf(m, "  .%-30s: %lu\n", #x, (unsigned long)(dl_rq->x))
92648365b38SDaniel Bristot de Oliveira 
92748365b38SDaniel Bristot de Oliveira 	PU(dl_nr_running);
928ef477183SSteven Rostedt (Red Hat) #ifdef CONFIG_SMP
929ef477183SSteven Rostedt (Red Hat) 	dl_bw = &cpu_rq(cpu)->rd->dl_bw;
930ef477183SSteven Rostedt (Red Hat) #else
931ef477183SSteven Rostedt (Red Hat) 	dl_bw = &dl_rq->dl_bw;
932ef477183SSteven Rostedt (Red Hat) #endif
933ef477183SSteven Rostedt (Red Hat) 	SEQ_printf(m, "  .%-30s: %lld\n", "dl_bw->bw", dl_bw->bw);
934ef477183SSteven Rostedt (Red Hat) 	SEQ_printf(m, "  .%-30s: %lld\n", "dl_bw->total_bw", dl_bw->total_bw);
93548365b38SDaniel Bristot de Oliveira 
93648365b38SDaniel Bristot de Oliveira #undef PU
937acb32132SWanpeng Li }
938acb32132SWanpeng Li 
print_cpu(struct seq_file * m,int cpu)939391e43daSPeter Zijlstra static void print_cpu(struct seq_file *m, int cpu)
940391e43daSPeter Zijlstra {
941391e43daSPeter Zijlstra 	struct rq *rq = cpu_rq(cpu);
942391e43daSPeter Zijlstra 
943391e43daSPeter Zijlstra #ifdef CONFIG_X86
944391e43daSPeter Zijlstra 	{
945391e43daSPeter Zijlstra 		unsigned int freq = cpu_khz ? : 1;
946391e43daSPeter Zijlstra 
947bbbfeac9SNathan Zimmer 		SEQ_printf(m, "cpu#%d, %u.%03u MHz\n",
948391e43daSPeter Zijlstra 			   cpu, freq / 1000, (freq % 1000));
949391e43daSPeter Zijlstra 	}
950391e43daSPeter Zijlstra #else
951bbbfeac9SNathan Zimmer 	SEQ_printf(m, "cpu#%d\n", cpu);
952391e43daSPeter Zijlstra #endif
953391e43daSPeter Zijlstra 
954391e43daSPeter Zijlstra #define P(x)								\
95513e099d2SPeter Zijlstra do {									\
95613e099d2SPeter Zijlstra 	if (sizeof(rq->x) == 4)						\
957a6fcdd8dS晏艳(采苓) 		SEQ_printf(m, "  .%-30s: %d\n", #x, (int)(rq->x));	\
95813e099d2SPeter Zijlstra 	else								\
95913e099d2SPeter Zijlstra 		SEQ_printf(m, "  .%-30s: %Ld\n", #x, (long long)(rq->x));\
96013e099d2SPeter Zijlstra } while (0)
96113e099d2SPeter Zijlstra 
962391e43daSPeter Zijlstra #define PN(x) \
963391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %Ld.%06ld\n", #x, SPLIT_NS(rq->x))
964391e43daSPeter Zijlstra 
965391e43daSPeter Zijlstra 	P(nr_running);
966391e43daSPeter Zijlstra 	P(nr_switches);
967391e43daSPeter Zijlstra 	P(nr_uninterruptible);
968391e43daSPeter Zijlstra 	PN(next_balance);
969fc840914SPeter Zijlstra 	SEQ_printf(m, "  .%-30s: %ld\n", "curr->pid", (long)(task_pid_nr(rq->curr)));
970391e43daSPeter Zijlstra 	PN(clock);
9715a537597SPeter Zijlstra 	PN(clock_task);
972391e43daSPeter Zijlstra #undef P
973391e43daSPeter Zijlstra #undef PN
974391e43daSPeter Zijlstra 
975391e43daSPeter Zijlstra #ifdef CONFIG_SMP
976db6ea2fbSWanpeng Li #define P64(n) SEQ_printf(m, "  .%-30s: %Ld\n", #n, rq->n);
977391e43daSPeter Zijlstra 	P64(avg_idle);
97837e6bae8SAlex Shi 	P64(max_idle_balance_cost);
979db6ea2fbSWanpeng Li #undef P64
980391e43daSPeter Zijlstra #endif
981391e43daSPeter Zijlstra 
9824fa8d299SJosh Poimboeuf #define P(n) SEQ_printf(m, "  .%-30s: %d\n", #n, schedstat_val(rq->n));
983cb251765SMel Gorman 	if (schedstat_enabled()) {
984cb251765SMel Gorman 		P(yld_count);
985cb251765SMel Gorman 		P(sched_count);
986cb251765SMel Gorman 		P(sched_goidle);
987391e43daSPeter Zijlstra 		P(ttwu_count);
988391e43daSPeter Zijlstra 		P(ttwu_local);
989cb251765SMel Gorman 	}
990391e43daSPeter Zijlstra #undef P
9914fa8d299SJosh Poimboeuf 
992391e43daSPeter Zijlstra 	print_cfs_stats(m, cpu);
993391e43daSPeter Zijlstra 	print_rt_stats(m, cpu);
994acb32132SWanpeng Li 	print_dl_stats(m, cpu);
995391e43daSPeter Zijlstra 
996391e43daSPeter Zijlstra 	print_rq(m, rq, cpu);
997bbbfeac9SNathan Zimmer 	SEQ_printf(m, "\n");
998391e43daSPeter Zijlstra }
999391e43daSPeter Zijlstra 
1000391e43daSPeter Zijlstra static const char *sched_tunable_scaling_names[] = {
1001391e43daSPeter Zijlstra 	"none",
1002ad2e379dSColin Ian King 	"logarithmic",
1003391e43daSPeter Zijlstra 	"linear"
1004391e43daSPeter Zijlstra };
1005391e43daSPeter Zijlstra 
sched_debug_header(struct seq_file * m)1006bbbfeac9SNathan Zimmer static void sched_debug_header(struct seq_file *m)
1007391e43daSPeter Zijlstra {
1008391e43daSPeter Zijlstra 	u64 ktime, sched_clk, cpu_clk;
1009391e43daSPeter Zijlstra 	unsigned long flags;
1010391e43daSPeter Zijlstra 
1011391e43daSPeter Zijlstra 	local_irq_save(flags);
1012391e43daSPeter Zijlstra 	ktime = ktime_to_ns(ktime_get());
1013391e43daSPeter Zijlstra 	sched_clk = sched_clock();
1014391e43daSPeter Zijlstra 	cpu_clk = local_clock();
1015391e43daSPeter Zijlstra 	local_irq_restore(flags);
1016391e43daSPeter Zijlstra 
1017b32e86b4SIngo Molnar 	SEQ_printf(m, "Sched Debug Version: v0.11, %s %.*s\n",
1018391e43daSPeter Zijlstra 		init_utsname()->release,
1019391e43daSPeter Zijlstra 		(int)strcspn(init_utsname()->version, " "),
1020391e43daSPeter Zijlstra 		init_utsname()->version);
1021391e43daSPeter Zijlstra 
1022391e43daSPeter Zijlstra #define P(x) \
1023391e43daSPeter Zijlstra 	SEQ_printf(m, "%-40s: %Ld\n", #x, (long long)(x))
1024391e43daSPeter Zijlstra #define PN(x) \
1025391e43daSPeter Zijlstra 	SEQ_printf(m, "%-40s: %Ld.%06ld\n", #x, SPLIT_NS(x))
1026391e43daSPeter Zijlstra 	PN(ktime);
1027391e43daSPeter Zijlstra 	PN(sched_clk);
1028391e43daSPeter Zijlstra 	PN(cpu_clk);
1029391e43daSPeter Zijlstra 	P(jiffies);
1030391e43daSPeter Zijlstra #ifdef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK
103135af99e6SPeter Zijlstra 	P(sched_clock_stable());
1032391e43daSPeter Zijlstra #endif
1033391e43daSPeter Zijlstra #undef PN
1034391e43daSPeter Zijlstra #undef P
1035391e43daSPeter Zijlstra 
1036391e43daSPeter Zijlstra 	SEQ_printf(m, "\n");
1037391e43daSPeter Zijlstra 	SEQ_printf(m, "sysctl_sched\n");
1038391e43daSPeter Zijlstra 
1039391e43daSPeter Zijlstra #define P(x) \
1040391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-40s: %Ld\n", #x, (long long)(x))
1041391e43daSPeter Zijlstra #define PN(x) \
1042391e43daSPeter Zijlstra 	SEQ_printf(m, "  .%-40s: %Ld.%06ld\n", #x, SPLIT_NS(x))
1043e4ec3318SPeter Zijlstra 	PN(sysctl_sched_base_slice);
1044391e43daSPeter Zijlstra 	P(sysctl_sched_features);
1045391e43daSPeter Zijlstra #undef PN
1046391e43daSPeter Zijlstra #undef P
1047391e43daSPeter Zijlstra 
1048bbbfeac9SNathan Zimmer 	SEQ_printf(m, "  .%-40s: %d (%s)\n",
1049bbbfeac9SNathan Zimmer 		"sysctl_sched_tunable_scaling",
1050391e43daSPeter Zijlstra 		sysctl_sched_tunable_scaling,
1051391e43daSPeter Zijlstra 		sched_tunable_scaling_names[sysctl_sched_tunable_scaling]);
1052391e43daSPeter Zijlstra 	SEQ_printf(m, "\n");
1053bbbfeac9SNathan Zimmer }
1054bbbfeac9SNathan Zimmer 
sched_debug_show(struct seq_file * m,void * v)1055bbbfeac9SNathan Zimmer static int sched_debug_show(struct seq_file *m, void *v)
1056bbbfeac9SNathan Zimmer {
1057bbbfeac9SNathan Zimmer 	int cpu = (unsigned long)(v - 2);
1058bbbfeac9SNathan Zimmer 
1059bbbfeac9SNathan Zimmer 	if (cpu != -1)
1060bbbfeac9SNathan Zimmer 		print_cpu(m, cpu);
1061bbbfeac9SNathan Zimmer 	else
1062bbbfeac9SNathan Zimmer 		sched_debug_header(m);
1063391e43daSPeter Zijlstra 
1064391e43daSPeter Zijlstra 	return 0;
1065391e43daSPeter Zijlstra }
1066391e43daSPeter Zijlstra 
sysrq_sched_debug_show(void)1067391e43daSPeter Zijlstra void sysrq_sched_debug_show(void)
1068391e43daSPeter Zijlstra {
1069bbbfeac9SNathan Zimmer 	int cpu;
1070bbbfeac9SNathan Zimmer 
1071bbbfeac9SNathan Zimmer 	sched_debug_header(NULL);
107202d4ac58SWei Li 	for_each_online_cpu(cpu) {
107302d4ac58SWei Li 		/*
107402d4ac58SWei Li 		 * Need to reset softlockup watchdogs on all CPUs, because
107502d4ac58SWei Li 		 * another CPU might be blocked waiting for us to process
107602d4ac58SWei Li 		 * an IPI or stop_machine.
107702d4ac58SWei Li 		 */
107802d4ac58SWei Li 		touch_nmi_watchdog();
107902d4ac58SWei Li 		touch_all_softlockup_watchdogs();
1080bbbfeac9SNathan Zimmer 		print_cpu(NULL, cpu);
108102d4ac58SWei Li 	}
1082bbbfeac9SNathan Zimmer }
1083bbbfeac9SNathan Zimmer 
1084bbbfeac9SNathan Zimmer /*
10853b03706fSIngo Molnar  * This iterator needs some explanation.
1086bbbfeac9SNathan Zimmer  * It returns 1 for the header position.
108797fb7a0aSIngo Molnar  * This means 2 is CPU 0.
108897fb7a0aSIngo Molnar  * In a hotplugged system some CPUs, including CPU 0, may be missing so we have
108997fb7a0aSIngo Molnar  * to use cpumask_* to iterate over the CPUs.
1090bbbfeac9SNathan Zimmer  */
sched_debug_start(struct seq_file * file,loff_t * offset)1091bbbfeac9SNathan Zimmer static void *sched_debug_start(struct seq_file *file, loff_t *offset)
1092bbbfeac9SNathan Zimmer {
1093bbbfeac9SNathan Zimmer 	unsigned long n = *offset;
1094bbbfeac9SNathan Zimmer 
1095bbbfeac9SNathan Zimmer 	if (n == 0)
1096bbbfeac9SNathan Zimmer 		return (void *) 1;
1097bbbfeac9SNathan Zimmer 
1098bbbfeac9SNathan Zimmer 	n--;
1099bbbfeac9SNathan Zimmer 
1100bbbfeac9SNathan Zimmer 	if (n > 0)
1101bbbfeac9SNathan Zimmer 		n = cpumask_next(n - 1, cpu_online_mask);
1102bbbfeac9SNathan Zimmer 	else
1103bbbfeac9SNathan Zimmer 		n = cpumask_first(cpu_online_mask);
1104bbbfeac9SNathan Zimmer 
1105bbbfeac9SNathan Zimmer 	*offset = n + 1;
1106bbbfeac9SNathan Zimmer 
1107bbbfeac9SNathan Zimmer 	if (n < nr_cpu_ids)
1108bbbfeac9SNathan Zimmer 		return (void *)(unsigned long)(n + 2);
110997fb7a0aSIngo Molnar 
1110bbbfeac9SNathan Zimmer 	return NULL;
1111bbbfeac9SNathan Zimmer }
1112bbbfeac9SNathan Zimmer 
sched_debug_next(struct seq_file * file,void * data,loff_t * offset)1113bbbfeac9SNathan Zimmer static void *sched_debug_next(struct seq_file *file, void *data, loff_t *offset)
1114bbbfeac9SNathan Zimmer {
1115bbbfeac9SNathan Zimmer 	(*offset)++;
1116bbbfeac9SNathan Zimmer 	return sched_debug_start(file, offset);
1117bbbfeac9SNathan Zimmer }
1118bbbfeac9SNathan Zimmer 
sched_debug_stop(struct seq_file * file,void * data)1119bbbfeac9SNathan Zimmer static void sched_debug_stop(struct seq_file *file, void *data)
1120bbbfeac9SNathan Zimmer {
1121bbbfeac9SNathan Zimmer }
1122bbbfeac9SNathan Zimmer 
1123bbbfeac9SNathan Zimmer static const struct seq_operations sched_debug_sops = {
1124bbbfeac9SNathan Zimmer 	.start		= sched_debug_start,
1125bbbfeac9SNathan Zimmer 	.next		= sched_debug_next,
1126bbbfeac9SNathan Zimmer 	.stop		= sched_debug_stop,
1127bbbfeac9SNathan Zimmer 	.show		= sched_debug_show,
1128bbbfeac9SNathan Zimmer };
1129bbbfeac9SNathan Zimmer 
11309e3bf946SValentin Schneider #define __PS(S, F) SEQ_printf(m, "%-45s:%21Ld\n", S, (long long)(F))
11319e3bf946SValentin Schneider #define __P(F) __PS(#F, F)
11329e3bf946SValentin Schneider #define   P(F) __PS(#F, p->F)
113368d7a190SDietmar Eggemann #define   PM(F, M) __PS(#F, p->F & (M))
11349e3bf946SValentin Schneider #define __PSN(S, F) SEQ_printf(m, "%-45s:%14Ld.%06ld\n", S, SPLIT_NS((long long)(F)))
11359e3bf946SValentin Schneider #define __PN(F) __PSN(#F, F)
11369e3bf946SValentin Schneider #define   PN(F) __PSN(#F, p->F)
1137b32e86b4SIngo Molnar 
1138b32e86b4SIngo Molnar 
1139397f2378SSrikar Dronamraju #ifdef CONFIG_NUMA_BALANCING
print_numa_stats(struct seq_file * m,int node,unsigned long tsf,unsigned long tpf,unsigned long gsf,unsigned long gpf)1140397f2378SSrikar Dronamraju void print_numa_stats(struct seq_file *m, int node, unsigned long tsf,
1141397f2378SSrikar Dronamraju 		unsigned long tpf, unsigned long gsf, unsigned long gpf)
1142397f2378SSrikar Dronamraju {
1143397f2378SSrikar Dronamraju 	SEQ_printf(m, "numa_faults node=%d ", node);
114467d9f6c2SSrikar Dronamraju 	SEQ_printf(m, "task_private=%lu task_shared=%lu ", tpf, tsf);
114567d9f6c2SSrikar Dronamraju 	SEQ_printf(m, "group_private=%lu group_shared=%lu\n", gpf, gsf);
1146397f2378SSrikar Dronamraju }
1147397f2378SSrikar Dronamraju #endif
1148397f2378SSrikar Dronamraju 
1149397f2378SSrikar Dronamraju 
sched_show_numa(struct task_struct * p,struct seq_file * m)1150b32e86b4SIngo Molnar static void sched_show_numa(struct task_struct *p, struct seq_file *m)
1151b32e86b4SIngo Molnar {
1152b32e86b4SIngo Molnar #ifdef CONFIG_NUMA_BALANCING
1153b32e86b4SIngo Molnar 	if (p->mm)
1154b32e86b4SIngo Molnar 		P(mm->numa_scan_seq);
1155b32e86b4SIngo Molnar 
1156397f2378SSrikar Dronamraju 	P(numa_pages_migrated);
1157397f2378SSrikar Dronamraju 	P(numa_preferred_nid);
1158397f2378SSrikar Dronamraju 	P(total_numa_faults);
1159397f2378SSrikar Dronamraju 	SEQ_printf(m, "current_node=%d, numa_group_id=%d\n",
1160397f2378SSrikar Dronamraju 			task_node(p), task_numa_group_id(p));
1161397f2378SSrikar Dronamraju 	show_numa_stats(p, m);
1162b32e86b4SIngo Molnar #endif
1163b32e86b4SIngo Molnar }
1164b32e86b4SIngo Molnar 
proc_sched_show_task(struct task_struct * p,struct pid_namespace * ns,struct seq_file * m)116574dc3384SAleksa Sarai void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns,
116674dc3384SAleksa Sarai 						  struct seq_file *m)
1167391e43daSPeter Zijlstra {
1168391e43daSPeter Zijlstra 	unsigned long nr_switches;
1169391e43daSPeter Zijlstra 
117074dc3384SAleksa Sarai 	SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm, task_pid_nr_ns(p, ns),
1171391e43daSPeter Zijlstra 						get_nr_threads(p));
1172391e43daSPeter Zijlstra 	SEQ_printf(m,
1173add332a1SKamalesh Babulal 		"---------------------------------------------------------"
1174add332a1SKamalesh Babulal 		"----------\n");
11759e3bf946SValentin Schneider 
1176ceeadb83SYafang Shao #define P_SCHEDSTAT(F)  __PS(#F, schedstat_val(p->stats.F))
1177ceeadb83SYafang Shao #define PN_SCHEDSTAT(F) __PSN(#F, schedstat_val(p->stats.F))
1178391e43daSPeter Zijlstra 
1179391e43daSPeter Zijlstra 	PN(se.exec_start);
1180391e43daSPeter Zijlstra 	PN(se.vruntime);
1181391e43daSPeter Zijlstra 	PN(se.sum_exec_runtime);
1182391e43daSPeter Zijlstra 
1183391e43daSPeter Zijlstra 	nr_switches = p->nvcsw + p->nivcsw;
1184391e43daSPeter Zijlstra 
1185cb251765SMel Gorman 	P(se.nr_migrations);
1186cb251765SMel Gorman 
1187cb251765SMel Gorman 	if (schedstat_enabled()) {
1188cb251765SMel Gorman 		u64 avg_atom, avg_per_cpu;
1189cb251765SMel Gorman 
1190ceeadb83SYafang Shao 		PN_SCHEDSTAT(sum_sleep_runtime);
1191847fc0cdSYafang Shao 		PN_SCHEDSTAT(sum_block_runtime);
1192ceeadb83SYafang Shao 		PN_SCHEDSTAT(wait_start);
1193ceeadb83SYafang Shao 		PN_SCHEDSTAT(sleep_start);
1194ceeadb83SYafang Shao 		PN_SCHEDSTAT(block_start);
1195ceeadb83SYafang Shao 		PN_SCHEDSTAT(sleep_max);
1196ceeadb83SYafang Shao 		PN_SCHEDSTAT(block_max);
1197ceeadb83SYafang Shao 		PN_SCHEDSTAT(exec_max);
1198ceeadb83SYafang Shao 		PN_SCHEDSTAT(slice_max);
1199ceeadb83SYafang Shao 		PN_SCHEDSTAT(wait_max);
1200ceeadb83SYafang Shao 		PN_SCHEDSTAT(wait_sum);
1201ceeadb83SYafang Shao 		P_SCHEDSTAT(wait_count);
1202ceeadb83SYafang Shao 		PN_SCHEDSTAT(iowait_sum);
1203ceeadb83SYafang Shao 		P_SCHEDSTAT(iowait_count);
1204ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_migrations_cold);
1205ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_failed_migrations_affine);
1206ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_failed_migrations_running);
1207ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_failed_migrations_hot);
1208ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_forced_migrations);
1209ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups);
1210ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_sync);
1211ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_migrate);
1212ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_local);
1213ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_remote);
1214ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_affine);
1215ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_affine_attempts);
1216ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_passive);
1217ceeadb83SYafang Shao 		P_SCHEDSTAT(nr_wakeups_idle);
1218391e43daSPeter Zijlstra 
1219391e43daSPeter Zijlstra 		avg_atom = p->se.sum_exec_runtime;
1220391e43daSPeter Zijlstra 		if (nr_switches)
1221b0ab99e7SMateusz Guzik 			avg_atom = div64_ul(avg_atom, nr_switches);
1222391e43daSPeter Zijlstra 		else
1223391e43daSPeter Zijlstra 			avg_atom = -1LL;
1224391e43daSPeter Zijlstra 
1225391e43daSPeter Zijlstra 		avg_per_cpu = p->se.sum_exec_runtime;
1226391e43daSPeter Zijlstra 		if (p->se.nr_migrations) {
1227391e43daSPeter Zijlstra 			avg_per_cpu = div64_u64(avg_per_cpu,
1228391e43daSPeter Zijlstra 						p->se.nr_migrations);
1229391e43daSPeter Zijlstra 		} else {
1230391e43daSPeter Zijlstra 			avg_per_cpu = -1LL;
1231391e43daSPeter Zijlstra 		}
1232391e43daSPeter Zijlstra 
1233391e43daSPeter Zijlstra 		__PN(avg_atom);
1234391e43daSPeter Zijlstra 		__PN(avg_per_cpu);
12354feee7d1SJosh Don 
12364feee7d1SJosh Don #ifdef CONFIG_SCHED_CORE
12374feee7d1SJosh Don 		PN_SCHEDSTAT(core_forceidle_sum);
12384feee7d1SJosh Don #endif
1239391e43daSPeter Zijlstra 	}
12404fa8d299SJosh Poimboeuf 
1241391e43daSPeter Zijlstra 	__P(nr_switches);
12429e3bf946SValentin Schneider 	__PS("nr_voluntary_switches", p->nvcsw);
12439e3bf946SValentin Schneider 	__PS("nr_involuntary_switches", p->nivcsw);
1244391e43daSPeter Zijlstra 
1245391e43daSPeter Zijlstra 	P(se.load.weight);
1246333bb864SAlex Shi #ifdef CONFIG_SMP
12479d89c257SYuyang Du 	P(se.avg.load_sum);
12489f683953SVincent Guittot 	P(se.avg.runnable_sum);
12499d89c257SYuyang Du 	P(se.avg.util_sum);
12509d89c257SYuyang Du 	P(se.avg.load_avg);
12519f683953SVincent Guittot 	P(se.avg.runnable_avg);
12529d89c257SYuyang Du 	P(se.avg.util_avg);
12539d89c257SYuyang Du 	P(se.avg.last_update_time);
125411137d38SVincent Guittot 	PM(se.avg.util_est, ~UTIL_AVG_UNCHANGED);
1255939fd731SKamalesh Babulal #endif
125696e74ebfSValentin Schneider #ifdef CONFIG_UCLAMP_TASK
1257ad32bb41SPavankumar Kondeti 	__PS("uclamp.min", p->uclamp_req[UCLAMP_MIN].value);
1258ad32bb41SPavankumar Kondeti 	__PS("uclamp.max", p->uclamp_req[UCLAMP_MAX].value);
125996e74ebfSValentin Schneider 	__PS("effective uclamp.min", uclamp_eff_value(p, UCLAMP_MIN));
126096e74ebfSValentin Schneider 	__PS("effective uclamp.max", uclamp_eff_value(p, UCLAMP_MAX));
126196e74ebfSValentin Schneider #endif
1262391e43daSPeter Zijlstra 	P(policy);
1263391e43daSPeter Zijlstra 	P(prio);
12641da1843fSViresh Kumar 	if (task_has_dl_policy(p)) {
126559f8c298STommaso Cucinotta 		P(dl.runtime);
126659f8c298STommaso Cucinotta 		P(dl.deadline);
12679065ce69SChristian Loehle 	} else if (fair_policy(p->policy)) {
12689065ce69SChristian Loehle 		P(se.slice);
126959f8c298STommaso Cucinotta 	}
1270f0e1a064STejun Heo #ifdef CONFIG_SCHED_CLASS_EXT
1271f0e1a064STejun Heo 	__PS("ext.enabled", task_on_scx(p));
1272f0e1a064STejun Heo #endif
12734fa8d299SJosh Poimboeuf #undef PN_SCHEDSTAT
12744fa8d299SJosh Poimboeuf #undef P_SCHEDSTAT
1275391e43daSPeter Zijlstra 
1276391e43daSPeter Zijlstra 	{
1277391e43daSPeter Zijlstra 		unsigned int this_cpu = raw_smp_processor_id();
1278391e43daSPeter Zijlstra 		u64 t0, t1;
1279391e43daSPeter Zijlstra 
1280391e43daSPeter Zijlstra 		t0 = cpu_clock(this_cpu);
1281391e43daSPeter Zijlstra 		t1 = cpu_clock(this_cpu);
12829e3bf946SValentin Schneider 		__PS("clock-delta", t1-t0);
1283391e43daSPeter Zijlstra 	}
1284b32e86b4SIngo Molnar 
1285b32e86b4SIngo Molnar 	sched_show_numa(p, m);
1286391e43daSPeter Zijlstra }
1287391e43daSPeter Zijlstra 
proc_sched_set_task(struct task_struct * p)1288391e43daSPeter Zijlstra void proc_sched_set_task(struct task_struct *p)
1289391e43daSPeter Zijlstra {
1290391e43daSPeter Zijlstra #ifdef CONFIG_SCHEDSTATS
1291ceeadb83SYafang Shao 	memset(&p->stats, 0, sizeof(p->stats));
1292391e43daSPeter Zijlstra #endif
1293391e43daSPeter Zijlstra }
1294c006fac5SPaul Turner 
resched_latency_warn(int cpu,u64 latency)1295c006fac5SPaul Turner void resched_latency_warn(int cpu, u64 latency)
1296c006fac5SPaul Turner {
1297c006fac5SPaul Turner 	static DEFINE_RATELIMIT_STATE(latency_check_ratelimit, 60 * 60 * HZ, 1);
1298c006fac5SPaul Turner 
12998061b9f5SDavid Rientjes 	if (likely(!__ratelimit(&latency_check_ratelimit)))
13008061b9f5SDavid Rientjes 		return;
13018061b9f5SDavid Rientjes 
13028061b9f5SDavid Rientjes 	pr_err("sched: CPU %d need_resched set for > %llu ns (%d ticks) without schedule\n",
1303c006fac5SPaul Turner 	       cpu, latency, cpu_rq(cpu)->ticks_without_resched);
13048061b9f5SDavid Rientjes 	dump_stack();
1305c006fac5SPaul Turner }
1306