pvclock: introduce seqcount-like API
The version field in struct pvclock_vcpu_time_info basically implements a seqcount. Wrap it with the usual read_begin and read_retry functions, and use these APIs instead of peppering the code with smp_rmb()s. While at it, change it to the more pedantically correct virt_rmb(). With this change, __pvclock_read_cycles can be simplified noticeably. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Этот коммит содержится в:
@@ -123,9 +123,7 @@ 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;
|
||||
@@ -137,10 +135,7 @@ static notrace cycle_t vread_pvclock(int *mode)
|
||||
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));
|
||||
} while (pvclock_read_retry(pvti, version));
|
||||
|
||||
delta = tsc - pvti_tsc;
|
||||
ret = pvti_system_time +
|
||||
|
Ссылка в новой задаче
Block a user