diff options
Diffstat (limited to 'arch/x86/kernel/kvmclock.c')
| -rw-r--r-- | arch/x86/kernel/kvmclock.c | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index f8492da65bfc..086eb58c6e80 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -22,6 +22,7 @@  #include <asm/msr.h>  #include <asm/apic.h>  #include <linux/percpu.h> +#include <linux/hardirq.h>  #include <asm/x86_init.h>  #include <asm/reboot.h> @@ -114,6 +115,25 @@ static void kvm_get_preset_lpj(void)  	preset_lpj = lpj;  } +bool kvm_check_and_clear_guest_paused(void) +{ +	bool ret = false; +	struct pvclock_vcpu_time_info *src; + +	/* +	 * per_cpu() is safe here because this function is only called from +	 * timer functions where preemption is already disabled. +	 */ +	WARN_ON(!in_atomic()); +	src = &__get_cpu_var(hv_clock); +	if ((src->flags & PVCLOCK_GUEST_STOPPED) != 0) { +		__this_cpu_and(hv_clock.flags, ~PVCLOCK_GUEST_STOPPED); +		ret = true; +	} + +	return ret; +} +  static struct clocksource kvm_clock = {  	.name = "kvm-clock",  	.read = kvm_clock_get_cycles,  | 
