sched: fix possible divide by zero in avg_atom calculation
Subsystems (2)
PATCH 1/1 sched: fix possible divide by zero in avg_atom calculation
proc_sched_show_task does:
if (nr_switches)
do_div(avg_atom, nr_switches);
nr_switches is unsigned long and do_div truncates it to 32 bits, which means it can test non-zero on e.g. x86-64 and be truncated to zero for division.
Fix the problem by using div64_ul instead.
As a side effect calculations of avg_atom for big nr_switches are now correct.
--- kernel/sched/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/debug.c +1 -1
@@ -608,7 +608,7 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) avg_atom = p->se.sum_exec_runtime;if (nr_switches) -do_div (avg_atom, nr_switches); + avg_atom =div64_ul (avg_atom, nr_switches);else avg_atom =-1LL ;
Signature · 1 line
1.8.3.1
Peter Zijlstra
maintainerQuoted 8 lines · Mateusz Guzik
proc_sched_show_taskdoes:
if (nr_switches)do_div(avg_atom, nr_switches);
nr_switchesis unsigned long anddo_divtruncates it to 32 bits, which means it can test non-zero on e.g. x86-64 and be truncated to zero for division.
Quoted 5 lines
Fix the problem by using
div64_ulinstead.As a side effect calculations of
avg_atomfor bignr_switchesare now correct.Signed-off-by Mateusz Guzik <[email protected]>
Thanks.
tip-bot for Mateusz Guzik
merge bot[tip:sched/urgent] sched: Fix possible divide by zero in avg_atom () calculation
In reply to Mateusz Guziksched: Fix possible divide by zero in avg_atom() calculation
Commit-ID: b0ab99e7736af88b8ac1b7ae50ea287fffa2badc Gitweb: http://git.kernel.org/tip/b0ab99e7736af88b8ac1b7ae50ea287fffa2badc Author: Mateusz Guzik <[email protected]> AuthorDate: Sat, 14 Jun 2014 15:00:09 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 16 Jul 2014 13:36:07 +0200
sched: Fix possible divide by zero in avg_atom() calculation
proc_sched_show_task() does:
if (nr_switches)
do_div(avg_atom, nr_switches);
nr_switches is unsigned long and do_div truncates it to 32 bits, which means it can test non-zero on e.g. x86-64 and be truncated to zero for division.
Fix the problem by using div64_ul() instead.
As a side effect calculations of avg_atom for big nr_switches are now correct.
--- kernel/sched/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/debug.c +1 -1
@@ -608,7 +608,7 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) avg_atom = p->se.sum_exec_runtime;if (nr_switches) -do_div (avg_atom, nr_switches); + avg_atom =div64_ul (avg_atom, nr_switches);else avg_atom =-1LL ;