]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
LoongArch: KVM: Implement handle idle exception
authorTianrui Zhao <zhaotianrui@loongson.cn>
Mon, 2 Oct 2023 02:01:28 +0000 (10:01 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Mon, 2 Oct 2023 02:01:28 +0000 (10:01 +0800)
Implement kvm handle LoongArch vcpu idle exception, using kvm_vcpu_block
to emulate it.

Reviewed-by: Bibo Mao <maobibo@loongson.cn>
Tested-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Tianrui Zhao <zhaotianrui@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kvm/exit.c

index 7e729dd9e91581de00169f7ae8e6d57514081f1e..d4d7e74f72afa92d487c2a7899cbbbfc7c6d3bd3 100644 (file)
@@ -194,3 +194,23 @@ int kvm_complete_iocsr_read(struct kvm_vcpu *vcpu, struct kvm_run *run)
 
        return er;
 }
+
+int kvm_emu_idle(struct kvm_vcpu *vcpu)
+{
+       ++vcpu->stat.idle_exits;
+       trace_kvm_exit_idle(vcpu, KVM_TRACE_EXIT_IDLE);
+
+       if (!kvm_arch_vcpu_runnable(vcpu)) {
+               /*
+                * Switch to the software timer before halt-polling/blocking as
+                * the guest's timer may be a break event for the vCPU, and the
+                * hypervisor timer runs only when the CPU is in guest mode.
+                * Switch before halt-polling so that KVM recognizes an expired
+                * timer before blocking.
+                */
+               kvm_save_timer(vcpu);
+               kvm_vcpu_block(vcpu);
+       }
+
+       return EMULATE_DONE;
+}