From: Thomas Schlichter <thomas.schlichter@web.de>
To: Srivatsa Vaddagiri <vatsa@in.ibm.com>, john stultz <johnstul@us.ibm.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] Updated dynamic tick patches - Fix lost tick
Date: Thu, 1 Sep 2005 08:29:32 +0200 [thread overview]
Message-ID: <200509010829.35958.thomas.schlichter@web.de> (raw)
[-- Attachment #1.1: body text --]
[-- Type: text/plain, Size: 1096 bytes --]
Hi Srivatsa,
on LKML I did see your patch trying to increase the accuracy of tme pmtmr by
directly converting the PM-timer-ticks to jiffies. I think this is a good
idea but as you already recognized, it is not completely correct...
There are at least these issues:
1. "offset_last" corresponds to the time when the last recognized
jiffyoccoured. So "delta" always corresponds to the time from the last
recognized jiffy to _now_. "monotonic_base" is increased by delta, so after
the first run it will correspond to _now_. But the next time the
offset-time between the last recognized jiffy and the last _now_ is added
_again_. So the monotonic clock ist too fast...
2. "offset_last is modified outside the "monotonic_lock", what is not allowed.
I fixed these issues by using most of the old code, but simply changed "delta"
and "offset_delay" to always contain PM-timer-ticks and compute the lost
jiffies directly using PMTMR_TICKS_PER_JIFFY.
I tested the attached patch during the last night and it sems to work...
Best regards
Thomas Schlichter
[-- Attachment #1.2: pmtmr_accuracy.patch --]
[-- Type: text/x-diff, Size: 2166 bytes --]
--- linux-2.6.13/arch/i386/kernel/timers/timer_pm.c.orig 2005-08-31 23:34:11.000000000 +0200
+++ linux-2.6.13/arch/i386/kernel/timers/timer_pm.c 2005-09-01 00:08:20.000000000 +0200
@@ -28,6 +28,7 @@
#define PMTMR_TICKS_PER_SEC 3579545
#define PMTMR_EXPECTED_RATE \
((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10))
+#define PMTMR_TICKS_PER_JIFFY (PMTMR_TICKS_PER_SEC / HZ)
/* The I/O port the PMTMR resides at.
@@ -128,6 +129,11 @@ pm_good:
return -ENODEV;
init_cpu_khz();
+
+ printk ("Using %u PM timer ticks per jiffy \n", PMTMR_TICKS_PER_JIFFY);
+
+ offset_tick = read_pmtmr();
+
return 0;
}
@@ -151,7 +157,6 @@ static inline u32 cyc2us(u32 cycles)
static void mark_offset_pmtmr(void)
{
u32 lost, delta, last_offset;
- static int first_run = 1;
last_offset = offset_tick;
write_seqlock(&monotonic_lock);
@@ -161,29 +166,23 @@ static void mark_offset_pmtmr(void)
/* calculate tick interval */
delta = (offset_tick - last_offset) & ACPI_PM_MASK;
- /* convert to usecs */
- delta = cyc2us(delta);
-
/* update the monotonic base value */
- monotonic_base += delta * NSEC_PER_USEC;
+ monotonic_base += cyc2us(delta) * NSEC_PER_USEC;
write_sequnlock(&monotonic_lock);
/* convert to ticks */
delta += offset_delay;
- lost = delta / (USEC_PER_SEC / HZ);
- offset_delay = delta % (USEC_PER_SEC / HZ);
+ lost = delta / PMTMR_TICKS_PER_JIFFY;
+ offset_delay = delta % PMTMR_TICKS_PER_JIFFY;
/* compensate for lost ticks */
if (lost >= 2)
jiffies_64 += lost - 1;
- /* don't calculate delay for first run,
- or if we've got less then a tick */
- if (first_run || (lost < 1)) {
- first_run = 0;
+ /* don't calculate delay if we've got less then a tick */
+ if (lost < 1)
offset_delay = 0;
- }
}
@@ -233,9 +232,9 @@ static unsigned long get_offset_pmtmr(vo
offset = offset_tick;
now = read_pmtmr();
- delta = (now - offset)&ACPI_PM_MASK;
+ delta = (now - offset) & ACPI_PM_MASK;
- return (unsigned long) offset_delay + cyc2us(delta);
+ return (unsigned long) cyc2us(delta + offset_delay);
}
[-- Attachment #2: signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
next reply other threads:[~2005-09-01 6:30 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-01 6:29 Thomas Schlichter [this message]
2005-09-01 7:23 ` [PATCH 1/3] Updated dynamic tick patches - Fix lost tick Srivatsa Vaddagiri
2005-09-01 7:42 ` Thomas Schlichter
2005-09-01 10:28 ` Srivatsa Vaddagiri
2005-09-01 11:05 ` Thomas Schlichter
2005-09-01 11:33 ` Srivatsa Vaddagiri
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=200509010829.35958.thomas.schlichter@web.de \
--to=thomas.schlichter@web.de \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=vatsa@in.ibm.com \
/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.