From: Jon Hunter <jon-hunter@ti.com>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep for more than 2.15 seconds
Date: Mon, 20 Apr 2009 16:16:05 -0500 [thread overview]
Message-ID: <49ECE615.2010800@ti.com> (raw)
Hello,
From reviewing the dynamic tick code, I noticed that the "max_delta_ns"
member of the "clock_event_device" structure, represents the upper limit
between timer events in nanoseconds. The variable, "max_delta_ns", is
defined as an unsigned long. An unsigned long is a 32-bit integer for
32-bit machines and is a 64-bit integer for 64-bit machines (if -m64
option is used for gcc). Also see [1].
The variable, "max_delta_ns", is configured by calling function
"clockevent_delta2ns()". The maximum value that "max_delta_ns" can be
set to by calling clockevent_delta2ns(), is LONG_MAX. For a 32-bit
machine LONG_MAX is equal to 0x7fffffff and in nanoseconds this equates
to ~2.15 seconds. Hence, the maximum sleep time for a 32-bit machine is
~2.15 seconds, where as for a 64-bit machine it will be many years.
Therefore, I wanted to propose changing the type of max_delta_ns to be
"unsigned long long" instead of "unsigned long". My understanding is
that a variable of type "unsigned long long" is 64-bits for both 32-bit
and 64-bit machines and hence this would allow a 32-bit machine to sleep
for longer than ~2.15 seconds. Please note that I also ended up making
"min_delta_ns" of type "unsigned long long" too and although this is
probably very unnecessary, it made the patch simpler. See below.
Anyway, making this change has allowed my 32-bit machine to sleep for
longer than ~2.15 seconds and thought this could be of interest to
others. Your comments/feedback would be appreciated.
[1] http://en.wikipedia.org/wiki/64-bit#64-bit_data_models
Cheers
Jon
Signed-off-by: Jon Hunter <jon-hunter@ti.com>
---
include/linux/clockchips.h | 6 +++---
kernel/hrtimer.c | 2 +-
kernel/time/clockevents.c | 10 +++++-----
kernel/time/tick-oneshot.c | 2 +-
kernel/time/timer_list.c | 4 ++--
5 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 3a1dbba..8154bc6 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -77,8 +77,8 @@ enum clock_event_nofitiers {
struct clock_event_device {
const char *name;
unsigned int features;
- unsigned long max_delta_ns;
- unsigned long min_delta_ns;
+ unsigned long long max_delta_ns;
+ unsigned long long min_delta_ns;
unsigned long mult;
int shift;
int rating;
@@ -116,7 +116,7 @@ static inline unsigned long div_sc(unsigned long
ticks, unsigned long nsec,
}
/* Clock event layer functions */
-extern unsigned long clockevent_delta2ns(unsigned long latch,
+extern unsigned long long clockevent_delta2ns(unsigned long latch,
struct clock_event_device *evt);
extern void clockevents_register_device(struct clock_event_device *dev);
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index cb8a15c..5b1cdc4 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -1199,7 +1199,7 @@ hrtimer_interrupt_hanging(struct
clock_event_device *dev,
force_clock_reprogram = 1;
dev->min_delta_ns = (unsigned long)try_time.tv64 * 3;
printk(KERN_WARNING "hrtimer: interrupt too slow, "
- "forcing clock min delta to %lu ns\n", dev->min_delta_ns);
+ "forcing clock min delta to %llu ns\n", dev->min_delta_ns);
}
/*
* High resolution timer interrupt
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index d13be21..3fa07b3 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -36,10 +36,10 @@ static DEFINE_SPINLOCK(clockevents_lock);
*
* Math helper, returns latch value converted to nanoseconds (bound
checked)
*/
-unsigned long clockevent_delta2ns(unsigned long latch,
+unsigned long long clockevent_delta2ns(unsigned long latch,
struct clock_event_device *evt)
{
- u64 clc = ((u64) latch << evt->shift);
+ unsigned long long clc = ((unsigned long long) latch << evt->shift);
if (unlikely(!evt->mult)) {
evt->mult = 1;
@@ -49,10 +49,10 @@ unsigned long clockevent_delta2ns(unsigned long latch,
do_div(clc, evt->mult);
if (clc < 1000)
clc = 1000;
- if (clc > LONG_MAX)
- clc = LONG_MAX;
+ if (clc > LLONG_MAX)
+ clc = LLONG_MAX;
- return (unsigned long) clc;
+ return clc;
}
/**
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c
index 2e8de67..857087b 100644
--- a/kernel/time/tick-oneshot.c
+++ b/kernel/time/tick-oneshot.c
@@ -50,7 +50,7 @@ int tick_dev_program_event(struct clock_event_device
*dev, ktime_t expires,
dev->min_delta_ns += dev->min_delta_ns >> 1;
printk(KERN_WARNING
- "CE: %s increasing min_delta_ns to %lu nsec\n",
+ "CE: %s increasing min_delta_ns to %llu nsec\n",
dev->name ? dev->name : "?",
dev->min_delta_ns << 1);
diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c
index a999b92..3bf30b4 100644
--- a/kernel/time/timer_list.c
+++ b/kernel/time/timer_list.c
@@ -204,8 +204,8 @@ print_tickdevice(struct seq_file *m, struct
tick_device *td, int cpu)
return;
}
SEQ_printf(m, "%s\n", dev->name);
- SEQ_printf(m, " max_delta_ns: %lu\n", dev->max_delta_ns);
- SEQ_printf(m, " min_delta_ns: %lu\n", dev->min_delta_ns);
+ SEQ_printf(m, " max_delta_ns: %llu\n", dev->max_delta_ns);
+ SEQ_printf(m, " min_delta_ns: %llu\n", dev->min_delta_ns);
SEQ_printf(m, " mult: %lu\n", dev->mult);
SEQ_printf(m, " shift: %d\n", dev->shift);
SEQ_printf(m, " mode: %d\n", dev->mode);
--
1.6.1
next reply other threads:[~2009-04-20 21:16 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-20 21:16 Jon Hunter [this message]
2009-04-21 6:35 ` [RFC][PATCH] Dynamic Tick: Allow 32-bit machines to sleep for more than 2.15 seconds 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
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=49ECE615.2010800@ti.com \
--to=jon-hunter@ti.com \
--cc=linux-kernel@vger.kernel.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.