On 3/26/21 9:01 AM, Vitaly Kuznetsov wrote:
Vitaly Kuznetsov <[email protected]> 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.

Reply via email to