Index: include/vmmvar.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/vmmvar.h,v retrieving revision 1.81 diff -u -p -r1.81 vmmvar.h --- include/vmmvar.h 1 Sep 2022 22:01:40 -0000 1.81 +++ include/vmmvar.h 8 Nov 2022 18:09:32 -0000 @@ -934,6 +934,7 @@ struct vcpu { struct rwlock vc_lock; struct refcnt vc_refcnt; /* [a] */ + struct cpu_info *vc_curcpu; struct cpu_info *vc_last_pcpu; /* [v] */ struct vm_exit vc_exit; /* [v] */ Index: amd64/vmm.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/vmm.c,v retrieving revision 1.324 diff -u -p -r1.324 vmm.c --- amd64/vmm.c 1 Nov 2022 01:01:14 -0000 1.324 +++ amd64/vmm.c 8 Nov 2022 18:09:33 -0000 @@ -880,6 +880,7 @@ vm_intr_pending(struct vm_intr_params *v { struct vm *vm; struct vcpu *vcpu; + struct cpu_info *ci; int error, ret = 0; /* Find the desired VM */ @@ -896,9 +897,10 @@ vm_intr_pending(struct vm_intr_params *v goto out; } - rw_enter_write(&vcpu->vc_lock); vcpu->vc_intr = vip->vip_intr; - rw_exit_write(&vcpu->vc_lock); + ci = READ_ONCE(vcpu->vc_curcpu); + if (ci != NULL) + x86_send_ipi(ci, X86_IPI_NOP); refcnt_rele_wake(&vcpu->vc_refcnt); out: @@ -4562,6 +4564,7 @@ vm_run(struct vm_run_params *vrp) } } + WRITE_ONCE(vcpu->vc_curcpu, curcpu()); /* Run the VCPU specified in vrp */ if (vcpu->vc_virt_mode == VMM_MODE_VMX || vcpu->vc_virt_mode == VMM_MODE_EPT) { @@ -4570,6 +4573,7 @@ vm_run(struct vm_run_params *vrp) vcpu->vc_virt_mode == VMM_MODE_RVI) { ret = vcpu_run_svm(vcpu, vrp); } + WRITE_ONCE(vcpu->vc_curcpu, NULL); atomic_dec_int(&vm->vm_vcpus_running); if (ret == 0 || ret == EAGAIN) {