public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* X86_64 monotonic_clock goes backwards
@ 2006-08-04 14:34 Dimitri Sivanich
  2006-08-05  0:09 ` Andi Kleen
  0 siblings, 1 reply; 2+ messages in thread
From: Dimitri Sivanich @ 2006-08-04 14:34 UTC (permalink / raw)
  To: linux-kernel

I've noticed some erratic behavior while testing the X86_64 version
of monotonic_clock().

While spinning in a loop reading monotonic clock values (pinned to a
single cpu) I noticed that the difference between subsequent values
occasionally went negative (time going backwards).

I found that in the following code:
                this_offset = get_cycles_sync();
                /* FIXME: 1000 or 1000000? */
-->             offset = (this_offset - last_offset)*1000 / cpu_khz;
        }       
        return base + offset;

the offset sometimes turns out to be 0, even though
this_offset > last_offset.

The following patch does correct this, and -seems- to be correct.
Some reording of code may still be desired.

Dimitri


Index: linux/arch/x86_64/kernel/time.c
===================================================================
--- linux.orig/arch/x86_64/kernel/time.c
+++ linux/arch/x86_64/kernel/time.c
@@ -281,6 +281,7 @@ static void set_rtc_mmss(unsigned long n
  *		Note: This function is required to return accurate
  *		time even in the absence of multiple timer ticks.
  */
+static inline unsigned long long cycles_2_ns(unsigned long long cyc);
 unsigned long long monotonic_clock(void)
 {
 	unsigned long seq;
@@ -305,8 +306,7 @@ unsigned long long monotonic_clock(void)
 			base = monotonic_base;
 		} while (read_seqretry(&xtime_lock, seq));
 		this_offset = get_cycles_sync();
-		/* FIXME: 1000 or 1000000? */
-		offset = (this_offset - last_offset)*1000 / cpu_khz;
+		offset = cycles_2_ns(this_offset - last_offset);
 	}
 	return base + offset;
 }

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

* Re: X86_64 monotonic_clock goes backwards
  2006-08-04 14:34 X86_64 monotonic_clock goes backwards Dimitri Sivanich
@ 2006-08-05  0:09 ` Andi Kleen
  0 siblings, 0 replies; 2+ messages in thread
From: Andi Kleen @ 2006-08-05  0:09 UTC (permalink / raw)
  To: Dimitri Sivanich; +Cc: linux-kernel

Dimitri Sivanich <sivanich@sgi.com> writes:

> I've noticed some erratic behavior while testing the X86_64 version
> of monotonic_clock().

Added thanks.

-Andi

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

end of thread, other threads:[~2006-08-05  0:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-04 14:34 X86_64 monotonic_clock goes backwards Dimitri Sivanich
2006-08-05  0:09 ` Andi Kleen

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