Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7a3481c authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar
Browse files

x86/pvclock: Zero last_value on resume



If the guest domain has been suspend/resumed or migrated, then the
system clock backing the pvclock clocksource may revert to a smaller
value (ie, can be non-monotonic across the migration/save-restore).

Make sure we zero last_value in that case so that the domain
continues to see clock updates.

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 0f639a3c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,7 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
			    struct pvclock_vcpu_time_info *vcpu,
			    struct pvclock_vcpu_time_info *vcpu,
			    struct timespec *ts);
			    struct timespec *ts);
void pvclock_resume(void);


/*
/*
 * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
 * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
+5 −0
Original line number Original line Diff line number Diff line
@@ -83,6 +83,11 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)


static atomic64_t last_value = ATOMIC64_INIT(0);
static atomic64_t last_value = ATOMIC64_INIT(0);


void pvclock_resume(void)
{
	atomic64_set(&last_value, 0);
}

cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
{
{
	struct pvclock_shadow_time shadow;
	struct pvclock_shadow_time shadow;
+2 −0
Original line number Original line Diff line number Diff line
@@ -426,6 +426,8 @@ void xen_timer_resume(void)
{
{
	int cpu;
	int cpu;


	pvclock_resume();

	if (xen_clockevent != &xen_vcpuop_clockevent)
	if (xen_clockevent != &xen_vcpuop_clockevent)
		return;
		return;