|
@@ -61,11 +61,14 @@ void pvclock_resume(void)
|
|
|
u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src)
|
|
u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src)
|
|
|
{
|
|
{
|
|
|
unsigned version;
|
|
unsigned version;
|
|
|
- cycle_t ret;
|
|
|
|
|
u8 flags;
|
|
u8 flags;
|
|
|
|
|
|
|
|
do {
|
|
do {
|
|
|
- version = __pvclock_read_cycles(src, &ret, &flags);
|
|
|
|
|
|
|
+ version = src->version;
|
|
|
|
|
+ /* Make the latest version visible */
|
|
|
|
|
+ smp_rmb();
|
|
|
|
|
+
|
|
|
|
|
+ flags = src->flags;
|
|
|
/* Make sure that the version double-check is last. */
|
|
/* Make sure that the version double-check is last. */
|
|
|
smp_rmb();
|
|
smp_rmb();
|
|
|
} while ((src->version & 1) || version != src->version);
|
|
} while ((src->version & 1) || version != src->version);
|