Skip to contentSkip to conversation

sched: fix possible divide by zero in avg_atom calculation

PATCH In review Mateusz Guzik 3 participants 3 messages Jun 14, 2014 – Jul 16, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index 695f977..627b3c3 100644
@@ -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
maintainer
#1 lore raw
Quoted 8 lines · Mateusz Guzik

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.

Quoted 5 lines

Fix the problem by using div64_ul instead.

As a side effect calculations of avg_atom for big nr_switches are now correct.

Thanks.

#2 lore raw

[tip:sched/urgent] sched: Fix possible divide by zero in avg_atom () calculation

In reply to Mateusz Guzik
sched: 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
index 695f977..627b3c3 100644
@@ -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;