aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-06-10 14:24:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-06-10 14:24:39 -0400
commit60e383037ba192d86fc0110b5b5a9a2013d83b13 (patch)
tree14618b9efcd260f1987fc8003228dd0838130a91 /kernel/sched
parent7fcbc230c6f0ee96d397e30d061ef4995879b835 (diff)
parent4698f88c06b893f2acc0b443004a53bf490fde7c (diff)
Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler fixes from Ingo Molnar: "Two scheduler debugging fixes" * 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/debug: Fix 'schedstats=enable' cmdline option sched/debug: Fix /proc/sched_debug regression
Diffstat (limited to 'kernel/sched')
-rw-r--r--kernel/sched/core.c26
-rw-r--r--kernel/sched/debug.c15
-rw-r--r--kernel/sched/stats.h3
3 files changed, 28 insertions, 16 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 7f2cae4620c7..385c947482e1 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2253,9 +2253,11 @@ int sysctl_numa_balancing(struct ctl_table *table, int write,
2253#endif 2253#endif
2254#endif 2254#endif
2255 2255
2256#ifdef CONFIG_SCHEDSTATS
2257
2256DEFINE_STATIC_KEY_FALSE(sched_schedstats); 2258DEFINE_STATIC_KEY_FALSE(sched_schedstats);
2259static bool __initdata __sched_schedstats = false;
2257 2260
2258#ifdef CONFIG_SCHEDSTATS
2259static void set_schedstats(bool enabled) 2261static void set_schedstats(bool enabled)
2260{ 2262{
2261 if (enabled) 2263 if (enabled)
@@ -2278,11 +2280,16 @@ static int __init setup_schedstats(char *str)
2278 if (!str) 2280 if (!str)
2279 goto out; 2281 goto out;
2280 2282
2283 /*
2284 * This code is called before jump labels have been set up, so we can't
2285 * change the static branch directly just yet. Instead set a temporary
2286 * variable so init_schedstats() can do it later.
2287 */
2281 if (!strcmp(str, "enable")) { 2288 if (!strcmp(str, "enable")) {
2282 set_schedstats(true); 2289 __sched_schedstats = true;
2283 ret = 1; 2290 ret = 1;
2284 } else if (!strcmp(str, "disable")) { 2291 } else if (!strcmp(str, "disable")) {
2285 set_schedstats(false); 2292 __sched_schedstats = false;
2286 ret = 1; 2293 ret = 1;
2287 } 2294 }
2288out: 2295out:
@@ -2293,6 +2300,11 @@ out:
2293} 2300}
2294__setup("schedstats=", setup_schedstats); 2301__setup("schedstats=", setup_schedstats);
2295 2302
2303static void __init init_schedstats(void)
2304{
2305 set_schedstats(__sched_schedstats);
2306}
2307
2296#ifdef CONFIG_PROC_SYSCTL 2308#ifdef CONFIG_PROC_SYSCTL
2297int sysctl_schedstats(struct ctl_table *table, int write, 2309int sysctl_schedstats(struct ctl_table *table, int write,
2298 void __user *buffer, size_t *lenp, loff_t *ppos) 2310 void __user *buffer, size_t *lenp, loff_t *ppos)
@@ -2313,8 +2325,10 @@ int sysctl_schedstats(struct ctl_table *table, int write,
2313 set_schedstats(state); 2325 set_schedstats(state);
2314 return err; 2326 return err;
2315} 2327}
2316#endif 2328#endif /* CONFIG_PROC_SYSCTL */
2317#endif 2329#else /* !CONFIG_SCHEDSTATS */
2330static inline void init_schedstats(void) {}
2331#endif /* CONFIG_SCHEDSTATS */
2318 2332
2319/* 2333/*
2320 * fork()/clone()-time setup: 2334 * fork()/clone()-time setup:
@@ -7487,6 +7501,8 @@ void __init sched_init(void)
7487#endif 7501#endif
7488 init_sched_fair_class(); 7502 init_sched_fair_class();
7489 7503
7504 init_schedstats();
7505
7490 scheduler_running = 1; 7506 scheduler_running = 1;
7491} 7507}
7492 7508
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index cf905f655ba1..0368c393a336 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -427,19 +427,12 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
427 SPLIT_NS(p->se.vruntime), 427 SPLIT_NS(p->se.vruntime),
428 (long long)(p->nvcsw + p->nivcsw), 428 (long long)(p->nvcsw + p->nivcsw),
429 p->prio); 429 p->prio);
430#ifdef CONFIG_SCHEDSTATS 430
431 if (schedstat_enabled()) {
432 SEQ_printf(m, "%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld",
433 SPLIT_NS(p->se.statistics.wait_sum),
434 SPLIT_NS(p->se.sum_exec_runtime),
435 SPLIT_NS(p->se.statistics.sum_sleep_runtime));
436 }
437#else
438 SEQ_printf(m, "%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld", 431 SEQ_printf(m, "%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld",
439 0LL, 0L, 432 SPLIT_NS(schedstat_val(p, se.statistics.wait_sum)),
440 SPLIT_NS(p->se.sum_exec_runtime), 433 SPLIT_NS(p->se.sum_exec_runtime),
441 0LL, 0L); 434 SPLIT_NS(schedstat_val(p, se.statistics.sum_sleep_runtime)));
442#endif 435
443#ifdef CONFIG_NUMA_BALANCING 436#ifdef CONFIG_NUMA_BALANCING
444 SEQ_printf(m, " %d %d", task_node(p), task_numa_group_id(p)); 437 SEQ_printf(m, " %d %d", task_node(p), task_numa_group_id(p));
445#endif 438#endif
diff --git a/kernel/sched/stats.h b/kernel/sched/stats.h
index 70b3b6a20fb0..78955cbea31c 100644
--- a/kernel/sched/stats.h
+++ b/kernel/sched/stats.h
@@ -33,6 +33,8 @@ rq_sched_info_dequeued(struct rq *rq, unsigned long long delta)
33# define schedstat_inc(rq, field) do { if (schedstat_enabled()) { (rq)->field++; } } while (0) 33# define schedstat_inc(rq, field) do { if (schedstat_enabled()) { (rq)->field++; } } while (0)
34# define schedstat_add(rq, field, amt) do { if (schedstat_enabled()) { (rq)->field += (amt); } } while (0) 34# define schedstat_add(rq, field, amt) do { if (schedstat_enabled()) { (rq)->field += (amt); } } while (0)
35# define schedstat_set(var, val) do { if (schedstat_enabled()) { var = (val); } } while (0) 35# define schedstat_set(var, val) do { if (schedstat_enabled()) { var = (val); } } while (0)
36# define schedstat_val(rq, field) ((schedstat_enabled()) ? (rq)->field : 0)
37
36#else /* !CONFIG_SCHEDSTATS */ 38#else /* !CONFIG_SCHEDSTATS */
37static inline void 39static inline void
38rq_sched_info_arrive(struct rq *rq, unsigned long long delta) 40rq_sched_info_arrive(struct rq *rq, unsigned long long delta)
@@ -47,6 +49,7 @@ rq_sched_info_depart(struct rq *rq, unsigned long long delta)
47# define schedstat_inc(rq, field) do { } while (0) 49# define schedstat_inc(rq, field) do { } while (0)
48# define schedstat_add(rq, field, amt) do { } while (0) 50# define schedstat_add(rq, field, amt) do { } while (0)
49# define schedstat_set(var, val) do { } while (0) 51# define schedstat_set(var, val) do { } while (0)
52# define schedstat_val(rq, field) 0
50#endif 53#endif
51 54
52#ifdef CONFIG_SCHED_INFO 55#ifdef CONFIG_SCHED_INFO