.. | .. |
---|
255 | 255 | { |
---|
256 | 256 | u32 flags = kvm_read_and_reset_apf_flags(); |
---|
257 | 257 | irqentry_state_t state; |
---|
| 258 | + unsigned long irqflags; |
---|
258 | 259 | |
---|
259 | 260 | if (!flags) |
---|
260 | 261 | return false; |
---|
261 | 262 | |
---|
262 | 263 | state = irqentry_enter(regs); |
---|
| 264 | + oob_trap_notify(X86_TRAP_PF, regs); |
---|
263 | 265 | instrumentation_begin(); |
---|
| 266 | + irqflags = hard_cond_local_irq_save(); |
---|
264 | 267 | |
---|
265 | 268 | /* |
---|
266 | 269 | * If the host managed to inject an async #PF into an interrupt |
---|
.. | .. |
---|
279 | 282 | WARN_ONCE(1, "Unexpected async PF flags: %x\n", flags); |
---|
280 | 283 | } |
---|
281 | 284 | |
---|
| 285 | + hard_cond_local_irq_restore(irqflags); |
---|
282 | 286 | instrumentation_end(); |
---|
| 287 | + oob_trap_unwind(X86_TRAP_PF, regs); |
---|
283 | 288 | irqentry_exit(regs, state); |
---|
284 | 289 | return true; |
---|
285 | 290 | } |
---|
.. | .. |
---|
478 | 483 | |
---|
479 | 484 | static void kvm_guest_cpu_offline(bool shutdown) |
---|
480 | 485 | { |
---|
| 486 | + unsigned long flags; |
---|
| 487 | + |
---|
| 488 | + flags = hard_local_irq_save(); |
---|
481 | 489 | kvm_disable_steal_time(); |
---|
482 | 490 | if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) |
---|
483 | 491 | wrmsrl(MSR_KVM_PV_EOI_EN, 0); |
---|
.. | .. |
---|
485 | 493 | if (!shutdown) |
---|
486 | 494 | apf_task_wake_all(); |
---|
487 | 495 | kvmclock_disable(); |
---|
| 496 | + hard_local_irq_restore(flags); |
---|
488 | 497 | } |
---|
489 | 498 | |
---|
490 | 499 | static int kvm_cpu_online(unsigned int cpu) |
---|
491 | 500 | { |
---|
492 | 501 | unsigned long flags; |
---|
493 | 502 | |
---|
494 | | - local_irq_save(flags); |
---|
| 503 | + local_irq_save_full(flags); |
---|
495 | 504 | kvm_guest_cpu_init(); |
---|
496 | | - local_irq_restore(flags); |
---|
| 505 | + local_irq_restore_full(flags); |
---|
497 | 506 | return 0; |
---|
498 | 507 | } |
---|
499 | 508 | |
---|
.. | .. |
---|
907 | 916 | if (in_nmi()) |
---|
908 | 917 | return; |
---|
909 | 918 | |
---|
910 | | - local_irq_save(flags); |
---|
| 919 | + flags = hard_local_irq_save(); |
---|
911 | 920 | |
---|
912 | 921 | if (READ_ONCE(*ptr) != val) |
---|
913 | 922 | goto out; |
---|
.. | .. |
---|
923 | 932 | safe_halt(); |
---|
924 | 933 | |
---|
925 | 934 | out: |
---|
926 | | - local_irq_restore(flags); |
---|
| 935 | + hard_local_irq_restore(flags); |
---|
927 | 936 | } |
---|
928 | 937 | |
---|
929 | 938 | #ifdef CONFIG_X86_32 |
---|