From: Yasunori Goto <y-goto@jp.fujitsu.com>
To: clemens@ladisch.de
Cc: Linux Kernel ML <linux-kernel@vger.kernel.org>,
tglx@linutronix.de, mingo@redhat.com
Subject: [Patch] Fix the possibility of insane return value of hpet_calibrate() against SMI.
Date: Thu, 04 Dec 2008 19:34:24 +0900 [thread overview]
Message-ID: <20081204192607.6B38.E1E9C6FF@jp.fujitsu.com> (raw)
Hello.
I think there is a possibility that hpet_calibrate() will return
an insane value when SMI interrupts.
701 static unsigned long hpet_calibrate(struct hpets *hpetp)
:
:
728 do {
729 m = read_counter(&hpet->hpet_mc);
730 write_counter(t + m + hpetp->hp_delta, &timer->hpet_compare);
731 } while (i++, (m - start) < count);
732
733 local_irq_restore(flags);
734
735 return (m - start) / i;
If SMI interrupts between 728 to 731, then return value will be
bigger value than correct one. This is the fix for it.
I found it by just reviewing about SMI and the codes of timer calibration.
But, I've not encountered this issue, and this issue is very difficult
to produce. So, if I'm something wrong, sorry for noise.
Thanks.
---
hpet_calibrate() has a possibility of miss-calibration due to SMI.
If SMI interrupts in the while loop of calibration, then return value
will be big. This changes it tries 3 times and get minimum value.
Signed-off-by: Yasunori Goto <y-goto@jp.fujitsu.com>
---
Index: hpet_test/drivers/char/hpet.c
===================================================================
--- hpet_test.orig/drivers/char/hpet.c 2008-12-04 16:24:02.000000000 +0900
+++ hpet_test/drivers/char/hpet.c 2008-12-04 16:34:59.000000000 +0900
@@ -713,7 +713,7 @@
*/
#define TICK_CALIBRATE (1000UL)
-static unsigned long hpet_calibrate(struct hpets *hpetp)
+static unsigned long __hpet_calibrate(struct hpets *hpetp)
{
struct hpet_timer __iomem *timer = NULL;
unsigned long t, m, count, i, flags, start;
@@ -750,6 +750,17 @@
return (m - start) / i;
}
+static unsigned long hpet_calibrate(struct hpets *hpetp)
+{
+ unsigned long ret = ~0UL, i;
+
+ /* Try 3 times to remove impact of SMI.*/
+ for (i = 0; i < 3; i++)
+ ret = min(ret, __hpet_calibrate(hpetp));
+
+ return ret;
+}
+
int hpet_alloc(struct hpet_data *hdp)
{
u64 cap, mcfg;
--
Yasunori Goto
next reply other threads:[~2008-12-04 10:34 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-04 10:34 Yasunori Goto [this message]
2009-03-13 5:00 Yasunori Goto
2009-03-14 8:23 ` Rik van Riel
2009-03-15 19:56 ` Paul Gortmaker
2009-03-16 2:34 ` Yasunori Goto
2009-03-16 8:59 ` Vojtech Pavlik
2009-03-16 9:52 ` Clemens Ladisch
2009-03-17 10:12 ` Yasunori Goto
2009-03-17 13:12 ` Paul Gortmaker
2009-03-18 0:45 ` Yasunori Goto
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=20081204192607.6B38.E1E9C6FF@jp.fujitsu.com \
--to=y-goto@jp.fujitsu.com \
--cc=clemens@ladisch.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®