[POWERPC] Fix gettimeofday inaccuracies
authorNathan Lynch <ntl@pobox.com>
Wed, 23 Aug 2006 01:36:05 +0000 (20:36 -0500)
committerPaul Mackerras <paulus@samba.org>
Wed, 23 Aug 2006 05:51:18 +0000 (15:51 +1000)
commit5db9fa9593e2ff69f2b95f9d59229dc4faaa564d
treed58ba58c05408edf8993d0da5a31b3ea3df1a053
parentaa74a30be971c632d734e487df42278b1cf85151
[POWERPC] Fix gettimeofday inaccuracies

There are two problems in the powerpc gettimeofday code which can
cause incorrect results to be returned.

The first is that there is a race between do_gettimeofday and the
timer interrupt:

1. do_gettimeofday does get_tb()

2. decrementer exception on boot cpu which runs timer_recalc_offset,
   which also samples the timebase and updates the do_gtod structure
   with a greater timebase value.

3. do_gettimeofday calls __do_gettimeofday, which leads to the
   negative result from tb_val - temp_varp->tb_orig_stamp.

The second is caused by taking the boot cpu offline, which can cause
the value of tb_last_jiffy to be increased past the currently
available timebase, causing the same underflow as above.

[paulus@samba.org - define and use data_barrier() instead of mb().]

Signed-off-by: Nathan Lynch <ntl@pobox.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/time.c
include/asm-powerpc/system.h