Messages in this thread | | | Subject | Re: [PATCH] x86/kvmclock: Stop kvmclocks for hibernate restore | From | Lenny Szubowicz <> | Date | Fri, 26 Mar 2021 13:14:03 -0400 |
| |
On 3/26/21 9:01 AM, Vitaly Kuznetsov wrote: > Vitaly Kuznetsov <vkuznets@redhat.com> writes: > > .. > >> (this is with your v2 included). There's nothing about CPU0 for >> e.g. async PF + timestamps are really interesting. Seems we have issues >> to fix) I'm playing with it right now. > > What if we do the following (instead of your patch): > > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c > index 78bb0fae3982..c32392d6329d 100644 > --- a/arch/x86/kernel/kvm.c > +++ b/arch/x86/kernel/kvm.c > @@ -26,6 +26,7 @@ > #include <linux/kprobes.h> > #include <linux/nmi.h> > #include <linux/swait.h> > +#include <linux/syscore_ops.h> > #include <asm/timer.h> > #include <asm/cpu.h> > #include <asm/traps.h> > @@ -598,17 +599,21 @@ static void kvm_guest_cpu_offline(void) > > static int kvm_cpu_online(unsigned int cpu) > { > - local_irq_disable(); > + unsigned long flags; > + > + local_irq_save(flags); > kvm_guest_cpu_init(); > - local_irq_enable(); > + local_irq_restore(flags); > return 0; > } > > static int kvm_cpu_down_prepare(unsigned int cpu) > { > - local_irq_disable(); > + unsigned long flags; > + > + local_irq_save(flags); > kvm_guest_cpu_offline(); > - local_irq_enable(); > + local_irq_restore(flags); > return 0; > } > #endif > @@ -639,6 +644,23 @@ static void kvm_flush_tlb_others(const struct cpumask *cpumask, > native_flush_tlb_others(flushmask, info); > } > > +static int kvm_suspend(void) > +{ > + kvm_guest_cpu_offline(); > + > + return 0; > +} > + > +static void kvm_resume(void) > +{ > + kvm_cpu_online(raw_smp_processor_id()); > +} > + > +static struct syscore_ops kvm_syscore_ops = { > + .suspend = kvm_suspend, > + .resume = kvm_resume, > +}; > + > static void __init kvm_guest_init(void) > { > int i; > @@ -681,6 +703,8 @@ static void __init kvm_guest_init(void) > kvm_guest_cpu_init(); > #endif > > + register_syscore_ops(&kvm_syscore_ops); > + > /* > * Hard lockup detection is enabled by default. Disable it, as guests > * can get false positives too easily, for example if the host is >
Yes, I do like using register_syscore_ops for this. I will base my V3 on this. -Lenny.
| |