Save/restore kvmclock across suspend/resume via clocksource hooks when
kvmclock isn't being used for sched_clock.  This will allow using kvmclock
as a clocksource (or for wallclock!) without also using it for sched_clock.

Signed-off-by: Sean Christopherson <sea...@google.com>
---
 arch/x86/kernel/kvmclock.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index 0580fe1aefa0..319f8b2d0702 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -130,7 +130,17 @@ static void kvm_setup_secondary_clock(void)
 
 static void kvm_restore_sched_clock_state(void)
 {
-       kvm_register_clock("primary cpu clock, resume");
+       kvm_register_clock("primary cpu, sched_clock resume");
+}
+
+static void kvmclock_suspend(struct clocksource *cs)
+{
+       kvmclock_disable();
+}
+
+static void kvmclock_resume(struct clocksource *cs)
+{
+       kvm_register_clock("primary cpu, clocksource resume");
 }
 
 void kvmclock_cpu_action(enum kvm_guest_cpu_action action)
@@ -201,6 +211,8 @@ static struct clocksource kvm_clock = {
        .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
        .id     = CSID_X86_KVM_CLK,
        .enable = kvm_cs_enable,
+       .suspend = kvmclock_suspend,
+       .resume = kvmclock_resume,
 };
 
 static void __init kvmclock_init_mem(void)
@@ -295,6 +307,15 @@ static void __init kvm_sched_clock_init(bool stable)
        __paravirt_set_sched_clock(kvm_sched_clock_read, stable,
                                   kvm_save_sched_clock_state, 
kvm_restore_sched_clock_state);
 
+       /*
+        * The BSP's clock is managed via dedicated sched_clock save/restore
+        * hooks when kvmclock is used as sched_clock, as sched_clock needs to
+        * be kept alive until the very end of suspend entry, and restored as
+        * quickly as possible after resume.
+        */
+       kvm_clock.suspend = NULL;
+       kvm_clock.resume = NULL;
+
        pr_info("kvm-clock: using sched offset of %llu cycles",
                kvm_sched_clock_offset);
 
-- 
2.48.1.711.g2feabab25a-goog


Reply via email to