From: tip-bot for John Stultz <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, sboyd@codeaurora.org,
mingo@kernel.org, prarit@redhat.com,
torvalds@linux-foundation.org, davej@codemonkey.org.uk,
peterz@infradead.org, john.stultz@linaro.org, tglx@linutronix.de,
hpa@zytor.com, richardcochran@gmail.com
Subject: [tip:timers/core] clocksource: Simplify the clocks_calc_max_nsecs () logic
Date: Fri, 13 Mar 2015 02:01:14 -0700 [thread overview]
Message-ID: <tip-6086e346fdea1ae64d974c94c1acacc2605567ae@git.kernel.org> (raw)
In-Reply-To: <1426133800-29329-2-git-send-email-john.stultz@linaro.org>
Commit-ID: 6086e346fdea1ae64d974c94c1acacc2605567ae
Gitweb: http://git.kernel.org/tip/6086e346fdea1ae64d974c94c1acacc2605567ae
Author: John Stultz <john.stultz@linaro.org>
AuthorDate: Wed, 11 Mar 2015 21:16:29 -0700
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 12 Mar 2015 10:16:38 +0100
clocksource: Simplify the clocks_calc_max_nsecs() logic
The previous clocks_calc_max_nsecs() code had some unecessarily
complex bit logic to find the max interval that could cause
multiplication overflows. Since this is not in the hot
path, just do the divide to make it easier to read.
The previous implementation also had a subtle issue
that it avoided overflows with signed 64-bit values, where
as the intervals are always unsigned. This resulted in
overly conservative intervals, which other safety margins
were then added to, reducing the intended interval length.
Signed-off-by: John Stultz <john.stultz@linaro.org>
Cc: Dave Jones <davej@codemonkey.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1426133800-29329-2-git-send-email-john.stultz@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/time/clocksource.c | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 4892352..2148f41 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -476,19 +476,10 @@ u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask)
/*
* Calculate the maximum number of cycles that we can pass to the
- * cyc2ns function without overflowing a 64-bit signed result. The
- * maximum number of cycles is equal to ULLONG_MAX/(mult+maxadj)
- * which is equivalent to the below.
- * max_cycles < (2^63)/(mult + maxadj)
- * max_cycles < 2^(log2((2^63)/(mult + maxadj)))
- * max_cycles < 2^(log2(2^63) - log2(mult + maxadj))
- * max_cycles < 2^(63 - log2(mult + maxadj))
- * max_cycles < 1 << (63 - log2(mult + maxadj))
- * Please note that we add 1 to the result of the log2 to account for
- * any rounding errors, ensure the above inequality is satisfied and
- * no overflow will occur.
+ * cyc2ns() function without overflowing a 64-bit result.
*/
- max_cycles = 1ULL << (63 - (ilog2(mult + maxadj) + 1));
+ max_cycles = ULLONG_MAX;
+ do_div(max_cycles, mult+maxadj);
/*
* The actual maximum number of cycles we can defer the clocksource is
next prev parent reply other threads:[~2015-03-13 9:02 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-12 4:16 [PATCH 00/12] Increased clocksource validation and cleanups (v4) John Stultz
2015-03-12 4:16 ` [PATCH 01/12] clocksource: Simplify clocks_calc_max_nsecs logic John Stultz
2015-03-13 9:01 ` tip-bot for John Stultz [this message]
2015-03-12 4:16 ` [PATCH 02/12] clocksource: Simplify logic around clocksource wrapping safety margins John Stultz
2015-03-12 5:55 ` Ingo Molnar
2015-03-13 9:01 ` [tip:timers/core] clocksource: Simplify the " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 03/12] clocksource: Add max_cycles to clocksource structure John Stultz
2015-03-13 9:01 ` [tip:timers/core] clocksource: Add 'max_cycles' to ' struct clocksource' tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 04/12] time: Add debugging checks to warn if we see delays John Stultz
2015-03-12 6:32 ` Ingo Molnar
2015-03-13 9:02 ` [tip:timers/core] timekeeping: " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 05/12] time: Add infrastructure to cap clocksource reads to the max_cycles value John Stultz
2015-03-13 9:02 ` [tip:timers/core] timekeeping: Add checks to cap clocksource reads to the 'max_cycles' value tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 06/12] time: Try to catch clocksource delta underflows John Stultz
2015-03-13 9:02 ` [tip:timers/core] timekeeping: " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 07/12] time: Add warnings when overflows or underflows are observed John Stultz
2015-03-12 7:37 ` Ingo Molnar
2015-03-13 9:03 ` [tip:timers/core] timekeeping: " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 08/12] clocksource: Improve clocksource watchdog reporting John Stultz
2015-03-13 9:03 ` [tip:timers/core] " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 09/12] clocksource: Mostly kill clocksource_register() John Stultz
2015-03-13 9:03 ` [tip:timers/core] " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 10/12] sparc: Convert to using clocksource_register_hz() John Stultz
2015-03-13 9:04 ` [tip:timers/core] clocksource, sparc32: " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 11/12] clocksource: Add some debug info about clocksources being registered John Stultz
2015-03-13 9:04 ` [tip:timers/core] " tip-bot for John Stultz
2015-03-12 4:16 ` [PATCH 12/12] clocksource: Rename __clocksource_updatefreq_* to __clocksource_update_freq_* John Stultz
2015-03-13 9:04 ` [tip:timers/core] clocksource: Rename __clocksource_updatefreq_*( ) to __clocksource_update_freq_*() tip-bot for John Stultz
2015-03-12 9:19 ` [PATCH 00/12] Increased clocksource validation and cleanups (v4) Ingo Molnar
2015-03-12 16:26 ` John Stultz
2015-03-13 8:58 ` Ingo Molnar
2015-03-13 17:54 ` John Stultz
2015-03-16 8:28 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-6086e346fdea1ae64d974c94c1acacc2605567ae@git.kernel.org \
--to=tipbot@zytor.com \
--cc=davej@codemonkey.org.uk \
--cc=hpa@zytor.com \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=prarit@redhat.com \
--cc=richardcochran@gmail.com \
--cc=sboyd@codeaurora.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome