hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/x86/kernel/kvm.c
....@@ -255,12 +255,15 @@
255255 {
256256 u32 flags = kvm_read_and_reset_apf_flags();
257257 irqentry_state_t state;
258
+ unsigned long irqflags;
258259
259260 if (!flags)
260261 return false;
261262
262263 state = irqentry_enter(regs);
264
+ oob_trap_notify(X86_TRAP_PF, regs);
263265 instrumentation_begin();
266
+ irqflags = hard_cond_local_irq_save();
264267
265268 /*
266269 * If the host managed to inject an async #PF into an interrupt
....@@ -279,7 +282,9 @@
279282 WARN_ONCE(1, "Unexpected async PF flags: %x\n", flags);
280283 }
281284
285
+ hard_cond_local_irq_restore(irqflags);
282286 instrumentation_end();
287
+ oob_trap_unwind(X86_TRAP_PF, regs);
283288 irqentry_exit(regs, state);
284289 return true;
285290 }
....@@ -478,6 +483,9 @@
478483
479484 static void kvm_guest_cpu_offline(bool shutdown)
480485 {
486
+ unsigned long flags;
487
+
488
+ flags = hard_local_irq_save();
481489 kvm_disable_steal_time();
482490 if (kvm_para_has_feature(KVM_FEATURE_PV_EOI))
483491 wrmsrl(MSR_KVM_PV_EOI_EN, 0);
....@@ -485,15 +493,16 @@
485493 if (!shutdown)
486494 apf_task_wake_all();
487495 kvmclock_disable();
496
+ hard_local_irq_restore(flags);
488497 }
489498
490499 static int kvm_cpu_online(unsigned int cpu)
491500 {
492501 unsigned long flags;
493502
494
- local_irq_save(flags);
503
+ local_irq_save_full(flags);
495504 kvm_guest_cpu_init();
496
- local_irq_restore(flags);
505
+ local_irq_restore_full(flags);
497506 return 0;
498507 }
499508
....@@ -907,7 +916,7 @@
907916 if (in_nmi())
908917 return;
909918
910
- local_irq_save(flags);
919
+ flags = hard_local_irq_save();
911920
912921 if (READ_ONCE(*ptr) != val)
913922 goto out;
....@@ -923,7 +932,7 @@
923932 safe_halt();
924933
925934 out:
926
- local_irq_restore(flags);
935
+ hard_local_irq_restore(flags);
927936 }
928937
929938 #ifdef CONFIG_X86_32