diff mbox series

psi-pressure-stall-information-for-cpu-memory-and-io-fix-fix-fix

Message ID 20180717135133.3627980-1-arnd@arndb.de
State New
Headers show
Series psi-pressure-stall-information-for-cpu-memory-and-io-fix-fix-fix | expand

Commit Message

Arnd Bergmann July 17, 2018, 1:51 p.m. UTC
The addition of do_div() did not do the right thing, as it assigned the
result of the multiplication to an 'unsigned long', which truncates
it before the division. GCC warns in various ways about this depending
on the architecuture, e.g.

arch/arm/include/asm/div64.h:33:45: note: expected 'uint64_t *' {aka 'long long unsigned int *'} but argument is of type 'long unsigned int *'

This uses div_u64() instead. This is probably still a bad idea since
we should avoid 64-bit division altogether in the scheduler, but at
least it does the correct calculation.

Fixes: 13a67bcb35f5 ("psi-pressure-stall-information-for-cpu-memory-and-io-fix-fix")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
Please fold into the fix
---
 kernel/sched/psi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

-- 
2.9.0

Comments

Peter Zijlstra July 17, 2018, 3:17 p.m. UTC | #1
On Tue, Jul 17, 2018 at 03:51:24PM +0200, Arnd Bergmann wrote:
> The addition of do_div() did not do the right thing, as it assigned the

> result of the multiplication to an 'unsigned long', which truncates

> it before the division. GCC warns in various ways about this depending

> on the architecuture, e.g.

> 

> arch/arm/include/asm/div64.h:33:45: note: expected 'uint64_t *' {aka 'long long unsigned int *'} but argument is of type 'long unsigned int *'

> 

> This uses div_u64() instead. This is probably still a bad idea since

> we should avoid 64-bit division altogether in the scheduler, but at

> least it does the correct calculation.

> 

> Fixes: 13a67bcb35f5 ("psi-pressure-stall-information-for-cpu-memory-and-io-fix-fix")

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

> Please fold into the fix


Please drop the entire PSI series instead.
diff mbox series

Patch

diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
index eefe988ea7ce..9c3255ff50df 100644
--- a/kernel/sched/psi.c
+++ b/kernel/sched/psi.c
@@ -173,11 +173,10 @@  void __init psi_init(void)
 
 static void calc_avgs(unsigned long avg[3], u64 time, int missed_periods)
 {
-	unsigned long pct;
+	u64 pct;
 
 	/* Sample the most recent active period */
-	pct = time * 100;
-	do_div(pct, psi_period);
+	pct = div_u64(time * 100, psi_period);
 	pct *= FIXED_1;
 	avg[0] = calc_load(avg[0], EXP_10s, pct);
 	avg[1] = calc_load(avg[1], EXP_60s, pct);