Merge tag 'gfs2-4.8.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2...
[cascardo/linux.git] / arch / x86 / entry / vdso / vclock_gettime.c
index 2f02d23..94d54d0 100644 (file)
@@ -96,9 +96,8 @@ static notrace cycle_t vread_pvclock(int *mode)
 {
        const struct pvclock_vcpu_time_info *pvti = &get_pvti0()->pvti;
        cycle_t ret;
-       u64 tsc, pvti_tsc;
-       u64 last, delta, pvti_system_time;
-       u32 version, pvti_tsc_to_system_mul, pvti_tsc_shift;
+       u64 last;
+       u32 version;
 
        /*
         * Note: The kernel and hypervisor must guarantee that cpu ID
@@ -123,29 +122,15 @@ static notrace cycle_t vread_pvclock(int *mode)
         */
 
        do {
-               version = pvti->version;
-
-               smp_rmb();
+               version = pvclock_read_begin(pvti);
 
                if (unlikely(!(pvti->flags & PVCLOCK_TSC_STABLE_BIT))) {
                        *mode = VCLOCK_NONE;
                        return 0;
                }
 
-               tsc = rdtsc_ordered();
-               pvti_tsc_to_system_mul = pvti->tsc_to_system_mul;
-               pvti_tsc_shift = pvti->tsc_shift;
-               pvti_system_time = pvti->system_time;
-               pvti_tsc = pvti->tsc_timestamp;
-
-               /* Make sure that the version double-check is last. */
-               smp_rmb();
-       } while (unlikely((version & 1) || version != pvti->version));
-
-       delta = tsc - pvti_tsc;
-       ret = pvti_system_time +
-               pvclock_scale_delta(delta, pvti_tsc_to_system_mul,
-                                   pvti_tsc_shift);
+               ret = __pvclock_read_cycles(pvti);
+       } while (pvclock_read_retry(pvti, version));
 
        /* refer to vread_tsc() comment for rationale */
        last = gtod->cycle_last;