public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: tsc based udelay should have rdtsc_barrier
@ 2009-06-25 23:44 Pallipadi, Venkatesh
  2009-06-26  7:25 ` Ingo Molnar
  0 siblings, 1 reply; 2+ messages in thread
From: Pallipadi, Venkatesh @ 2009-06-25 23:44 UTC (permalink / raw)
  To: linux-kernel; +Cc: mingo, tglx, hpa


delay_tsc needs rdtsc_barrier to provide proper delay.

Output from a test driver using hpet to cross check delay
provided by udelay().

Before:
[   86.794363] Expected delay 5us actual 4679ns
[   87.154362] Expected delay 5us actual 698ns
[   87.514162] Expected delay 5us actual 4539ns
[   88.653716] Expected delay 5us actual 4539ns
[   94.664106] Expected delay 10us actual 9638ns
[   95.049351] Expected delay 10us actual 10126ns
[   95.416110] Expected delay 10us actual 9568ns
[   95.799216] Expected delay 10us actual 9638ns
[  103.624104] Expected delay 10us actual 9707ns
[  104.020619] Expected delay 10us actual 768ns
[  104.419951] Expected delay 10us actual 9707ns

After:
[   50.983320] Expected delay 5us actual 5587ns
[   51.261807] Expected delay 5us actual 5587ns
[   51.565715] Expected delay 5us actual 5657ns
[   51.861171] Expected delay 5us actual 5587ns
[   52.164704] Expected delay 5us actual 5726ns
[   52.487457] Expected delay 5us actual 5657ns
[   52.789338] Expected delay 5us actual 5726ns
[   57.119680] Expected delay 10us actual 10755ns
[   57.893997] Expected delay 10us actual 10615ns
[   58.261287] Expected delay 10us actual 10755ns
[   58.620505] Expected delay 10us actual 10825ns
[   58.941035] Expected delay 10us actual 10755ns
[   59.320903] Expected delay 10us actual 10615ns
[   61.306311] Expected delay 10us actual 10755ns
[   61.520542] Expected delay 10us actual 10615ns


Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
---
 arch/x86/lib/delay.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c
index f456860..ff485d3 100644
--- a/arch/x86/lib/delay.c
+++ b/arch/x86/lib/delay.c
@@ -55,8 +55,10 @@ static void delay_tsc(unsigned long loops)
 
 	preempt_disable();
 	cpu = smp_processor_id();
+	rdtsc_barrier();
 	rdtscl(bclock);
 	for (;;) {
+		rdtsc_barrier();
 		rdtscl(now);
 		if ((now - bclock) >= loops)
 			break;
@@ -78,6 +80,7 @@ static void delay_tsc(unsigned long loops)
 		if (unlikely(cpu != smp_processor_id())) {
 			loops -= (now - bclock);
 			cpu = smp_processor_id();
+			rdtsc_barrier();
 			rdtscl(bclock);
 		}
 	}
-- 
1.6.0.6


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] x86: tsc based udelay should have rdtsc_barrier
  2009-06-25 23:44 [PATCH] x86: tsc based udelay should have rdtsc_barrier Pallipadi, Venkatesh
@ 2009-06-26  7:25 ` Ingo Molnar
  0 siblings, 0 replies; 2+ messages in thread
From: Ingo Molnar @ 2009-06-26  7:25 UTC (permalink / raw)
  To: Pallipadi, Venkatesh; +Cc: linux-kernel, tglx, hpa


* Pallipadi, Venkatesh <venkatesh.pallipadi@intel.com> wrote:

> 
> delay_tsc needs rdtsc_barrier to provide proper delay.
> 
> Output from a test driver using hpet to cross check delay
> provided by udelay().
> 
> Before:
> [   86.794363] Expected delay 5us actual 4679ns
> [   87.154362] Expected delay 5us actual 698ns
> [   87.514162] Expected delay 5us actual 4539ns
> [   88.653716] Expected delay 5us actual 4539ns
> [   94.664106] Expected delay 10us actual 9638ns
> [   95.049351] Expected delay 10us actual 10126ns
> [   95.416110] Expected delay 10us actual 9568ns
> [   95.799216] Expected delay 10us actual 9638ns
> [  103.624104] Expected delay 10us actual 9707ns
> [  104.020619] Expected delay 10us actual 768ns
> [  104.419951] Expected delay 10us actual 9707ns
> 
> After:
> [   50.983320] Expected delay 5us actual 5587ns
> [   51.261807] Expected delay 5us actual 5587ns
> [   51.565715] Expected delay 5us actual 5657ns
> [   51.861171] Expected delay 5us actual 5587ns
> [   52.164704] Expected delay 5us actual 5726ns
> [   52.487457] Expected delay 5us actual 5657ns
> [   52.789338] Expected delay 5us actual 5726ns
> [   57.119680] Expected delay 10us actual 10755ns
> [   57.893997] Expected delay 10us actual 10615ns
> [   58.261287] Expected delay 10us actual 10755ns
> [   58.620505] Expected delay 10us actual 10825ns
> [   58.941035] Expected delay 10us actual 10755ns
> [   59.320903] Expected delay 10us actual 10615ns
> [   61.306311] Expected delay 10us actual 10755ns
> [   61.520542] Expected delay 10us actual 10615ns

Nice fix!

	Ingo

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-06-26  7:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-25 23:44 [PATCH] x86: tsc based udelay should have rdtsc_barrier Pallipadi, Venkatesh
2009-06-26  7:25 ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox