All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Stultz <john.stultz@linaro.org>
To: lkml <linux-kernel@vger.kernel.org>
Cc: John Stultz <john.stultz@linaro.org>,
	Dave Jones <davej@codemonkey.org.uk>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Richard Cochran <richardcochran@gmail.com>,
	Prarit Bhargava <prarit@redhat.com>,
	Stephen Boyd <sboyd@codeaurora.org>,
	Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>
Subject: [PATCH 01/12] clocksource: Simplify clocks_calc_max_nsecs logic
Date: Wed, 11 Mar 2015 21:16:29 -0700	[thread overview]
Message-ID: <1426133800-29329-2-git-send-email-john.stultz@linaro.org> (raw)
In-Reply-To: <1426133800-29329-1-git-send-email-john.stultz@linaro.org>

The previous clocks_calc_max_nsecs 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 into 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.

Cc: Dave Jones <davej@codemonkey.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: John Stultz <john.stultz@linaro.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..11323f4 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
-- 
1.9.1


  reply	other threads:[~2015-03-12  4:16 UTC|newest]

Thread overview: 36+ 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 ` John Stultz [this message]
2015-03-13  9:01   ` [tip:timers/core] clocksource: Simplify the clocks_calc_max_nsecs () logic tip-bot for John Stultz
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
  -- strict thread matches above, loose matches on Subject: below --
2015-03-07  2:49 [PATCH 00/12] Increased clocksource validation and cleanups (v3) John Stultz
2015-03-07  2:49 ` [PATCH 01/12] clocksource: Simplify clocks_calc_max_nsecs logic John Stultz
2015-03-07  9:20   ` Ingo Molnar
2015-01-23  0:09 [PATCH 00/12][RFC] Increased clocksource validation and cleanups (v2) John Stultz
2015-01-23  0:09 ` [PATCH 01/12] clocksource: Simplify clocks_calc_max_nsecs logic John Stultz

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=1426133800-29329-2-git-send-email-john.stultz@linaro.org \
    --to=john.stultz@linaro.org \
    --cc=davej@codemonkey.org.uk \
    --cc=linux-kernel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.