From: Jon Hunter <jon-hunter@ti.com>
To: John Stultz <johnstul@us.ibm.com>
Cc: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep formorethan2.15 seconds
Date: Fri, 15 May 2009 11:35:44 -0500 [thread overview]
Message-ID: <4A0D99E0.3050306@ti.com> (raw)
In-Reply-To: <1242242497.9777.2.camel@jstultz-laptop>
John Stultz wrote:
>>>> One final question, I noticed in clocksource.h that the definition of
>>>> function cyc2ns returns a type of s64, however, in the function itself a
>>>> variable of type u64 is used and returned. Should this function be
>>>> modified as follows?
>>>>
>>>> static inline s64 cyc2ns(struct clocksource *cs, cycle_t cycles)
>>>> {
>>>> - u64 ret = (u64)cycles;
>>>> + s64 ret = (s64)cycles;
>>>> ret = (ret * cs->mult) >> cs->shift;
>>>> return ret;
>>>> }
>>> Damn. So this brings up an issue I had missed prior.
>> Any comments on whether this should be u64 versus s64?
>
> I'd leave it alone for now. I'm concerns that in large multiplies, if
> its a s64 the sign might get extended down by the shift. I need to look
> at it in more detail though.
I have been thinking about this some more and I do agree that there is a
chance that the multiply could overflow if the "cycles" and "mult" are
large. From the perspective of the timekeeping_max_deferment() function
this would be very likely for 64-bit clocksources when the mask will be
equal to (2^64)-1. Therefore, how about modifying the function as
follows in order to catch any occurrences of overflow?
Let me know if this is aligned with your thinking or if I am barking up
the wrong tree here.
Cheers
Jon
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index 507235a..8204373 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -316,8 +316,32 @@ static inline void clocksource_disable(struct
clocksource *cs)
*/
static inline s64 cyc2ns(struct clocksource *cs, cycle_t cycles)
{
- s64 ret = (s64)cycles;
- ret = (ret * cs->mult) >> cs->shift;
+ s64 ret;
+ u64 upper, lower, overflow;
+
+ /*
+ * Split the calculation into two halves to ensure
+ * that we can catch any overflow that may occur.
+ */
+ upper = ((cycles >> 32) * cs->mult) >> cs->shift;
+ lower = ((cycles & 0xFFFFFFFF) * cs->mult) >> cs->shift;
+
+ /*
+ * Check to see if the result will overflow. If
+ * overflow is non-zero then the result is greater
+ * than 63-bits which is the max positive value
+ * for a signed result.
+ */
+ overflow = (upper + (lower >> 32)) >> 31;
+
+ /*
+ * If the result overflows, return the max value we can.
+ */
+ if (overflow)
+ ret = LONG_MAX;
+ else
+ ret = (s64)((upper << 32) + lower);
+
return ret;
}
--
1.6.1
next prev parent reply other threads:[~2009-05-15 16:36 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-20 21:16 [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep for more than 2.15 seconds Jon Hunter
2009-04-21 6:35 ` Ingo Molnar
2009-04-21 20:32 ` john stultz
2009-04-21 23:20 ` Jon Hunter
2009-04-22 0:02 ` john stultz
2009-05-07 14:52 ` Jon Hunter
2009-05-08 0:54 ` [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep formore " john stultz
2009-05-08 16:05 ` Jon Hunter
2009-05-09 0:51 ` [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep formorethan " john stultz
2009-05-12 23:35 ` Jon Hunter
2009-05-12 23:58 ` [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep formorethan2.15 seconds john stultz
2009-05-13 15:14 ` Jon Hunter
2009-05-13 16:41 ` John Stultz
2009-05-13 17:54 ` Jon Hunter
2009-05-13 19:21 ` John Stultz
2009-05-15 16:35 ` Jon Hunter [this message]
2009-05-15 18:55 ` Jon Hunter
2009-05-16 1:29 ` John Stultz
2009-05-16 1:18 ` John Stultz
2009-05-22 18:21 ` Jon Hunter
2009-05-22 19:23 ` john stultz
2009-05-22 19:54 ` Thomas Gleixner
2009-05-26 15:12 ` Jon Hunter
2009-05-26 20:26 ` john stultz
2009-05-22 19:59 ` Thomas Gleixner
2009-04-22 0:05 ` [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep for more than 2.15 seconds john stultz
2009-04-22 3:07 ` Jon Hunter
2009-04-22 15:30 ` Chris Friesen
2009-04-22 17:04 ` Jon Hunter
2009-04-22 18:53 ` Geert Uytterhoeven
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=4A0D99E0.3050306@ti.com \
--to=jon-hunter@ti.com \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/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.