[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <1393911500.6415.18.camel@marge.simpson.net>
Date: Tue, 04 Mar 2014 06:38:20 +0100
From: Mike Galbraith <bitbucket@...ine.de>
To: John Stultz <john.stultz@...aro.org>
Cc: LKML <linux-kernel@...r.kernel.org>,
"Cc: Salman Qazi" <sqazi@...gle.com>
Subject: [RFC][PATCH] clocksource: avoid unnecessary overflow in
cyclecounter_cyc2ns()
(crap crap crap... M.A.I.N.T.A.I.N.E.R.S _dummy_)
clocksource: avoid unnecessary overflow in cyclecounter_cyc2ns()
As per 4cecf6d401a "sched, x86: Avoid unnecessary overflow in sched_clock",
cycles * mult >> shift is overflow prone. so give it the same treatment.
Cc: Salman Qazi <sqazi@...gle.com>
Cc: John Stultz <john.stultz@...aro.org>,
Signed-off-by: Mike Galbraith <bitbucket@...ine.de>
---
include/linux/clocksource.h | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -77,13 +77,18 @@ struct timecounter {
*
* XXX - This could use some mult_lxl_ll() asm optimization. Same code
* as in cyc2ns, but with unsigned result.
+ *
+ * Because it is the same as x86 __cycles_2_ns, give it the same treatment as
+ * commit 4cecf6d401a "sched, x86: Avoid unnecessary overflow in sched_clock"
+ * to avoid a potential cycles * mult overflow.
*/
static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc,
cycle_t cycles)
{
- u64 ret = (u64)cycles;
- ret = (ret * cc->mult) >> cc->shift;
- return ret;
+ u64 quot = (u64)cycles >> cc->shift;
+ u64 rem = (u64)cycles & ((1ULL << cc->shift) - 1);
+
+ return quot * cc->mult + ((rem * cc->mult) >> cc->shift);
}
/**
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists