sched/debug: schedstats bug fix and cleanups
cover sched/debug: schedstats bug fix and cleanups
A /proc/sched_debug bug fix and a couple of other schedstats-related cleanups.
Josh Poimboeuf (3):
sched/debug: fix /proc/sched_debug regression sched/debug: always show nr_migrations sched/debug: remove unnecessary CONFIG_SCHEDSTATS checks
kernel/sched/debug.c | 24 +++++++++--------------- kernel/sched/fair.c | 4 ++-- 2 files changed, 11 insertions(+), 17 deletions(-)
Signature · 1 line
2.4.11
PATCH 1/3 sched/debug: fix /proc/sched_debug regression
Commit cb2517653fcc ("sched/debug: Make schedstats a runtime tunable that is disabled by default") introduced a bug when CONFIG_SCHEDSTATS is enabled and the runtime tunable is disabled (which is the default). The wait-time, sum-exec, and sum-sleep fields are missing from the /proc/sched_debug file in the runnable_tasks section.
Fix it by getting rid of the explicit check for CONFIG_SCHEDSTATS. It's already implicitly checked by schedstat_enabled() anyway.
--- kernel/sched/debug.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
kernel/sched/debug.c +8 -9
@@ -427,19 +427,18 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)SPLIT_NS (p->se.vruntime), (long long )(p->nvcsw + p->nivcsw), p->prio); -#ifdef CONFIG_SCHEDSTATS -if (schedstat_enabled ()) { + +if (schedstat_enabled ())SEQ_printf (m,"%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld" ,SPLIT_NS (p->se.statistics.wait_sum),SPLIT_NS (p->se.sum_exec_runtime),SPLIT_NS (p->se.statistics.sum_sleep_runtime)); - } -#else -SEQ_printf (m,"%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld" , -0LL ,0L , -SPLIT_NS (p->se.sum_exec_runtime), -0LL ,0L ); -#endif +else +SEQ_printf (m,"%9Ld.%06ld %9Ld.%06ld %9Ld.%06ld" , +0LL ,0L , +SPLIT_NS (p->se.sum_exec_runtime), +0LL ,0L ); +#ifdef CONFIG_NUMA_BALANCING SEQ_printf (m," %d %d" ,task_node (p),task_numa_group_id (p));#endif
Signature · 1 line
2.4.11
PATCH 2/3 sched/debug: always show nr_migrations
In reply to Josh PoimboeufThe nr_migrations field is updated independently of CONFIG_SCHEDSTATS, so it can be displayed regardless.
--- kernel/sched/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/debug.c +1 -1
@@ -885,9 +885,9 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) nr_switches = p->nvcsw + p->nivcsw; -#ifdef CONFIG_SCHEDSTATS P (se.nr_migrations); +#ifdef CONFIG_SCHEDSTATS if (schedstat_enabled ()) {u64 avg_atom, avg_per_cpu;
Signature · 1 line
2.4.11
PATCH 3/3 sched/debug: remove unnecessary CONFIG_SCHEDSTATS checks
In reply to Josh PoimboeufThe schedstat_enabled() macro already has an implicit check for CONFIG_SCHEDSTATS, so these explicit checks can be removed.
--- kernel/sched/debug.c | 7 +------ kernel/sched/fair.c | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-)
kernel/sched/debug.c +1 -6
@@ -378,7 +378,6 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_groupPN (se->exec_start);PN (se->vruntime);PN (se->sum_exec_runtime); -#ifdef CONFIG_SCHEDSTATS if (schedstat_enabled ()) {PN (se->statistics.wait_start);PN (se->statistics.sleep_start);
@@ -391,7 +390,6 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_groupPN (se->statistics.wait_sum);P (se->statistics.wait_count); } -#endif P (se->load.weight);#ifdef CONFIG_SMP P (se->avg.load_avg);
@@ -632,7 +630,6 @@ do { \#undef P64#endif -#ifdef CONFIG_SCHEDSTATS #define P (n) SEQ_printf(m, " .%-30s: %d\n", #n, rq->n);if (schedstat_enabled ()) {
@@ -644,7 +641,6 @@ do { \ }#undef P -#endif spin_lock_irqsave (&sched_debug_lock, flags);print_cfs_stats (m, cpu);print_rt_stats (m, cpu);
@@ -887,7 +883,6 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)P (se.nr_migrations); -#ifdef CONFIG_SCHEDSTATS if (schedstat_enabled ()) {u64 avg_atom, avg_per_cpu;
@@ -936,7 +931,7 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)__PN (avg_atom);__PN (avg_per_cpu); } -#endif +__P (nr_switches);SEQ_printf (m,"%-45s:%21Ld\n" ,"nr_voluntary_switches" , (long long )p->nvcsw);
kernel/sched/fair.c +2 -2
@@ -3447,7 +3447,7 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)update_stats_curr_start (cfs_rq, se); cfs_rq->curr = se; -#ifdef CONFIG_SCHEDSTATS +/* * Track our maximum slice length, if the CPU's load is at * least twice that of our own weight (i.e. dont track it
@@ -3457,7 +3457,7 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) se->statistics.slice_max =max (se->statistics.slice_max, se->sum_exec_runtime - se->prev_sum_exec_runtime); } -#endif + se->prev_sum_exec_runtime = se->sum_exec_runtime; }
Signature · 1 line
2.4.11
Re: [PATCH 3/3] sched/debug: remove unnecessary CONFIG_SCHEDSTATS checks
Quoted 12 lines · Josh Poimboeuf
kernel/sched/fair.c +1
-1@@ -3447,7 +3447,7 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)update_stats_curr_start (cfs_rq, se); cfs_rq->curr = se; -#ifdef CONFIG_SCHEDSTATS +/* * Track our maximum slice length, if the CPU's load is at * least twice that of our own weight (i.e. dont track it
kernel/sched/fair.c set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) · line 3461
Quoted 6 lines
kernel/sched/fair.c +1
-1@@ -3457,7 +3457,7 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) se->statistics.slice_max =max (se->statistics.slice_max, se->sum_exec_runtime - se->prev_sum_exec_runtime); } -#endif + se->prev_sum_exec_runtime = se->sum_exec_runtime;
Oops. This part fails to build without CONFIG_SCHEDSTATS. This hunk can just be removed from the patch.
Signature · 1 line
Josh
Quoted 14 lines · Josh Poimboeuf
A
/proc/sched_debugbug fix and a couple of other schedstats-related cleanups.Josh Poimboeuf (3):
sched/debug: fix/proc/sched_debugregression sched/debug: always shownr_migrationssched/debug: remove unnecessaryCONFIG_SCHEDSTATScheckskernel/sched/debug.c | 24 +++++++++--------------- kernel/sched/fair.c | 4 ++-- 2 files changed, 11 insertions(+), 17 deletions(-)Signature · 1 line
2.4.11
Sorry, the whole series is bad for the !SCHEDSTATS case. That's what I get for posting on a Friday afternoon!
Signature · 1 line
Josh