summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBibo Mao <maobibo@loongson.cn>2026-04-09 13:56:36 +0300
committerHuacai Chen <chenhuacai@loongson.cn>2026-04-09 13:56:36 +0300
commitf62eb9ca8def410bcef39e8909945409d0968473 (patch)
tree4033376a9601742d2936fee5c82ea98be25bf707
parent14d2714d6537a9df5bea2515185034dbb9d30f03 (diff)
downloadlinux-f62eb9ca8def410bcef39e8909945409d0968473.tar.xz
LoongArch: KVM: Move host CSR_EENTRY save and restore in context switch
CSR register LOONGARCH_CSR_EENTRY is shared between host CPU and guest vCPU, KVM need save and restore LOONGARCH_CSR_EENTRY register. Here move LOONGARCH_CSR_EENTRY saving in to context switch function rather than VM entry. At most time VM enter/exit is much more frequent than vCPU thread context switch. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
-rw-r--r--arch/loongarch/kvm/vcpu.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c
index fc8f7290cfed..3367a9886b63 100644
--- a/arch/loongarch/kvm/vcpu.c
+++ b/arch/loongarch/kvm/vcpu.c
@@ -320,7 +320,6 @@ static int kvm_pre_enter_guest(struct kvm_vcpu *vcpu)
* and it may also clear KVM_REQ_TLB_FLUSH_GPA pending bit
*/
kvm_late_check_requests(vcpu);
- vcpu->arch.host_eentry = csr_read64(LOONGARCH_CSR_EENTRY);
/* Clear KVM_LARCH_SWCSR_LATEST as CSR will change when enter guest */
vcpu->arch.aux_inuse &= ~KVM_LARCH_SWCSR_LATEST;
@@ -1628,9 +1627,11 @@ static int _kvm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
* If not, any old guest state from this vCPU will have been clobbered.
*/
context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
- if (migrated || (context->last_vcpu != vcpu))
+ if (migrated || (context->last_vcpu != vcpu)) {
+ context->last_vcpu = vcpu;
vcpu->arch.aux_inuse &= ~KVM_LARCH_HWCSR_USABLE;
- context->last_vcpu = vcpu;
+ vcpu->arch.host_eentry = csr_read64(LOONGARCH_CSR_EENTRY);
+ }
/* Restore timer state regardless */
kvm_restore_timer(vcpu);