| .. | .. |
|---|
| 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 |
|---|