Skip to content

Commit

Permalink
revert "x86: tsc prevent time going backwards"
Browse files Browse the repository at this point in the history
revert:

| commit 47001d6
| Author: Thomas Gleixner <tglx@linutronix.de>
| Date:   Tue Apr 1 19:45:18 2008 +0200
|
|     x86: tsc prevent time going backwards

it has been identified to cause suspend regression - and the
commit fixes a longstanding bug that existed before 2.6.25 was
opened - so it can wait some more until the effects are better
understood.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Ingo Molnar committed Apr 7, 2008
1 parent 4cac04d commit 5b13d86
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 34 deletions.
15 changes: 1 addition & 14 deletions arch/x86/kernel/tsc_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,27 +287,14 @@ core_initcall(cpufreq_tsc);
/* clock source code */

static unsigned long current_tsc_khz = 0;
static struct clocksource clocksource_tsc;

/*
* We compare the TSC to the cycle_last value in the clocksource
* structure to avoid a nasty time-warp issue. This can be observed in
* a very small window right after one CPU updated cycle_last under
* xtime lock and the other CPU reads a TSC value which is smaller
* than the cycle_last reference value due to a TSC which is slighty
* behind. This delta is nowhere else observable, but in that case it
* results in a forward time jump in the range of hours due to the
* unsigned delta calculation of the time keeping core code, which is
* necessary to support wrapping clocksources like pm timer.
*/
static cycle_t read_tsc(void)
{
cycle_t ret;

rdtscll(ret);

return ret >= clocksource_tsc.cycle_last ?
ret : clocksource_tsc.cycle_last;
return ret;
}

static struct clocksource clocksource_tsc = {
Expand Down
23 changes: 3 additions & 20 deletions arch/x86/kernel/tsc_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include <asm/hpet.h>
#include <asm/timex.h>
#include <asm/timer.h>
#include <asm/vgtod.h>

static int notsc __initdata = 0;

Expand Down Expand Up @@ -291,34 +290,18 @@ int __init notsc_setup(char *s)

__setup("notsc", notsc_setup);

static struct clocksource clocksource_tsc;

/*
* We compare the TSC to the cycle_last value in the clocksource
* structure to avoid a nasty time-warp. This can be observed in a
* very small window right after one CPU updated cycle_last under
* xtime/vsyscall_gtod lock and the other CPU reads a TSC value which
* is smaller than the cycle_last reference value due to a TSC which
* is slighty behind. This delta is nowhere else observable, but in
* that case it results in a forward time jump in the range of hours
* due to the unsigned delta calculation of the time keeping core
* code, which is necessary to support wrapping clocksources like pm
* timer.
*/
/* clock source code: */
static cycle_t read_tsc(void)
{
cycle_t ret = (cycle_t)get_cycles();

return ret >= clocksource_tsc.cycle_last ?
ret : clocksource_tsc.cycle_last;
return ret;
}

static cycle_t __vsyscall_fn vread_tsc(void)
{
cycle_t ret = (cycle_t)vget_cycles();

return ret >= __vsyscall_gtod_data.clock.cycle_last ?
ret : __vsyscall_gtod_data.clock.cycle_last;
return ret;
}

static struct clocksource clocksource_tsc = {
Expand Down

0 comments on commit 5b13d86

Please sign in to comment.