mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Alok Kataria <akataria@vmware.com>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>,
	LKML <linux-kernel@vger.kernel.org>,
	Arjan van de Veen <arjan@infradead.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Dan Hecht <dhecht@vmware.com>, Garrett Smith <garrett@vmware.com>
Subject: Re: [RFC patch 0/4] TSC calibration improvements
Date: Sat, 6 Sep 2008 22:52:22 +0200 (CEST)	[thread overview]
Message-ID: <alpine.LFD.1.10.0809062240170.3243@apollo.tec.linutronix.de> (raw)
In-Reply-To: <alpine.LFD.1.10.0809062233500.3243@apollo.tec.linutronix.de>

On Sat, 6 Sep 2008, Thomas Gleixner wrote:
> On Sat, 6 Sep 2008, Linus Torvalds wrote:
> > 
> > On Sat, 6 Sep 2008, Thomas Gleixner wrote:
> > > 
> > > Adding another check after the second get_cycles() makes it reliable:
> > 
> > My original patch actually had that, and Ingo added it to the -tip tree 
> > too (I think), so that should be the one we're discussing anyway. I just 
> > didn't think it would ever trigger in practice, which is why I removed it. 
> > Mea culpa.
> 
> My bad. Did not test that against -tip, just applied it from mail :)
> 
> Just checked. The -tip version still has the expect-- in the for()
> which might lead to stupid results depending on the gcc madness level.

If Alok has the second check in place and is actually worried about
that 288us impact, then we can add the following (untested), which
does not impact the speed of the check.

Against -tip x86/tsc

Thanks,

	tglx
---

diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 6dab90f..3bfe083 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -310,8 +310,8 @@ static unsigned long quick_pit_calibrate(void)
 		unsigned char expect = 0xfe;
 
 		t1 = get_cycles();
-		for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) {
-			if (!pit_expect_msb(expect))
+		for (i = 0; i < QUICK_PIT_ITERATIONS; i++) {
+			if (!pit_expect_msb(expect--))
 				goto failed;
 		}
 		t2 = get_cycles();
@@ -319,7 +319,7 @@ static unsigned long quick_pit_calibrate(void)
 		/*
 		 * Make sure we can rely on the second TSC timestamp:
 		 */
-		if (!pit_expect_msb(--expect))
+		if (!pit_expect_msb(expect))
 			goto failed;
 
 		/*
@@ -338,7 +338,6 @@ static unsigned long quick_pit_calibrate(void)
 		 */
 		delta = (t2 - t1)*PIT_TICK_RATE;
 		do_div(delta, QUICK_PIT_ITERATIONS*256*1000);
-		printk("Fast TSC calibration using PIT\n");
 		return delta;
 	}
 failed:
@@ -356,10 +355,42 @@ unsigned long native_calibrate_tsc(void)
 	int hpet = is_hpet_enabled(), i, loopmin;
 
 	local_irq_save(flags);
+	tsc1 = tsc_read_refs(&ref1, hpet);
 	fast_calibrate = quick_pit_calibrate();
+	tsc2 = tsc_read_refs(&ref1, hpet);
 	local_irq_restore(flags);
-	if (fast_calibrate)
-		return fast_calibrate;
+
+	if (fast_calibrate) {
+		/*
+		 * Return the fast_calibrate value when neither hpet
+		 * nor pmtimer are available.
+		 */
+		if (!hpet && !ref1 && !ref2) {
+			printk("Fast TSC calibration using PIT\n");
+			return fast_calibrate;
+		}
+
+		/* Check, whether the sampling was disturbed by an SMI */
+		if (tsc1 == ULLONG_MAX || tsc2 == ULLONG_MAX)
+			goto slowpath;
+
+		tsc2 = (tsc2 - tsc1) * 1000000LL;
+		if (hpet)
+			tsc2 = calc_hpet_ref(tsc2, ref1, ref2);
+		else
+			tsc2 = calc_pmtimer_ref(tsc2, ref1, ref2);
+
+		/* Check the reference deviation */
+		delta = ((u64) fast_calibrate) * 100;
+		do_div(delta, tsc2);
+
+		if (delta >= 90 && delta <= 110) {
+			printk("Fast TSC calibration using PIT\n");
+			return fast_calibrate;
+		}
+	}
+
+slowpath:
 
 	/*
 	 * Run 5 calibration loops to get the lowest frequency value


  parent reply	other threads:[~2008-09-06 20:52 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-04 15:18 Thomas Gleixner
2008-09-04 15:18 ` [RFC patch 1/4] x86: TSC: define the PIT latch value separate Thomas Gleixner
2008-09-04 15:18 ` [RFC patch 2/4] x86: TSC: separate hpet/pmtimer calculation out Thomas Gleixner
2008-09-04 15:18 ` [RFC patch 3/4] x86: TSC: use one set of reference variables Thomas Gleixner
2008-09-04 15:18 ` [RFC patch 4/4] x86: TSC make the calibration loop smarter Thomas Gleixner
2008-09-04 15:36 ` [RFC patch 0/4] TSC calibration improvements Ingo Molnar
2008-09-04 15:45   ` Linus Torvalds
2008-09-04 16:00     ` Ingo Molnar
2008-09-04 16:21       ` Linus Torvalds
2008-09-04 16:36         ` Ingo Molnar
2008-09-04 17:41         ` Linus Torvalds
2008-09-04 18:07           ` Alan Cox
2008-09-04 18:26             ` Linus Torvalds
2008-09-04 18:30               ` H. Peter Anvin
2008-09-04 20:09               ` Linus Torvalds
2008-09-04 20:43                 ` Ingo Molnar
2008-09-04 20:52                   ` Ingo Molnar
2008-09-04 21:09                     ` Linus Torvalds
2008-09-04 21:21                       ` Ingo Molnar
2008-09-04 21:30                         ` Linus Torvalds
2008-09-04 21:34                           ` Linus Torvalds
2008-09-04 21:39                             ` Ingo Molnar
2008-09-04 21:33                       ` Ingo Molnar
2008-09-05 22:18                         ` Alok Kataria
2008-09-05 22:34                           ` Linus Torvalds
2008-09-06 20:03                             ` Thomas Gleixner
2008-09-06 20:29                               ` Linus Torvalds
2008-09-06 20:37                                 ` Thomas Gleixner
2008-09-06 20:50                                   ` Linus Torvalds
2008-09-06 20:55                                     ` Linus Torvalds
2008-09-06 21:15                                       ` Thomas Gleixner
2008-09-06 21:22                                         ` Linus Torvalds
2008-09-06 21:30                                           ` Thomas Gleixner
2008-09-06 22:40                                       ` Ingo Molnar
2008-09-06 20:58                                     ` Thomas Gleixner
2008-09-06 21:10                                       ` Linus Torvalds
2008-09-07  6:01                                         ` Willy Tarreau
2008-09-06 20:52                                   ` Thomas Gleixner [this message]
2008-09-06 20:59                                     ` Linus Torvalds
2008-09-06 21:07                                       ` Thomas Gleixner
2008-09-06 21:15                                         ` Linus Torvalds
2008-09-06 21:26                                           ` Thomas Gleixner
2008-09-06 21:32                                             ` Linus Torvalds
2008-09-04 20:53                   ` Linus Torvalds
2008-09-04 21:38                 ` Alok Kataria
2008-09-04 21:52                   ` Linus Torvalds
2008-09-04 22:09                     ` Alok Kataria
2008-09-04 17:39     ` Alok Kataria
2008-09-04 17:53       ` Linus Torvalds
2008-09-04 18:31         ` Alok Kataria
2008-09-04 18:34           ` H. Peter Anvin
2008-09-04 21:00   ` Valdis.Kletnieks

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=alpine.LFD.1.10.0809062240170.3243@apollo.tec.linutronix.de \
    --to=tglx@linutronix.de \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akataria@vmware.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=arjan@infradead.org \
    --cc=dhecht@vmware.com \
    --cc=garrett@vmware.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --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 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®