]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
LoongArch: KVM: Remove KVM_LARCH_LSX and KVM_LARCH_LASX
authorBibo Mao <maobibo@loongson.cn>
Thu, 11 Jun 2026 12:46:40 +0000 (20:46 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 11 Jun 2026 12:46:40 +0000 (20:46 +0800)
In kvm_lose_fpu() FPU state is save in vcpu::arch::fpu, its FPU status
comes from vcpu->arch.aux_inuse. Instead existing API vm_guest_has_xxx()
can be used also, moreover, the bits KVM_LARCH_LSX and KVM_LARCH_LASX in
arch.aux_inuse are removed. It makes the logic simpler than ever.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/kvm_host.h
arch/loongarch/kvm/vcpu.c

index bad16c5f963ca87fe137b942a0023efad13ed685..23cfbecebbd79abc351217a198a0c3c4a68c74c6 100644 (file)
@@ -158,12 +158,10 @@ enum emulation_result {
 };
 
 #define KVM_LARCH_FPU          (0x1 << 0)
-#define KVM_LARCH_LSX          (0x1 << 1)
-#define KVM_LARCH_LASX         (0x1 << 2)
-#define KVM_LARCH_LBT          (0x1 << 3)
-#define KVM_LARCH_PMU          (0x1 << 4)
-#define KVM_LARCH_SWCSR_LATEST (0x1 << 5)
-#define KVM_LARCH_HWCSR_USABLE (0x1 << 6)
+#define KVM_LARCH_LBT          (0x1 << 1)
+#define KVM_LARCH_PMU          (0x1 << 2)
+#define KVM_LARCH_SWCSR_LATEST (0x1 << 3)
+#define KVM_LARCH_HWCSR_USABLE (0x1 << 4)
 
 #define LOONGARCH_PV_FEAT_UPDATED      BIT_ULL(63)
 #define LOONGARCH_PV_FEAT_MASK         (BIT(KVM_FEATURE_IPI) |         \
index e875efb26cb9ca6b4ffb165a87e0495db285d4ea..27a738cb53f2beb195bd1c694bf0d2f4541740a7 100644 (file)
@@ -1391,7 +1391,7 @@ int kvm_own_lsx(struct kvm_vcpu *vcpu)
        set_csr_euen(CSR_EUEN_LSXEN | CSR_EUEN_FPEN);
 
        kvm_restore_lsx(&vcpu->arch.fpu);
-       vcpu->arch.aux_inuse |= KVM_LARCH_LSX | KVM_LARCH_FPU;
+       vcpu->arch.aux_inuse |= KVM_LARCH_FPU;
        trace_kvm_aux(vcpu, KVM_TRACE_AUX_RESTORE, KVM_TRACE_AUX_LSX);
 
        return 0;
@@ -1406,7 +1406,7 @@ int kvm_own_lasx(struct kvm_vcpu *vcpu)
        set_csr_euen(CSR_EUEN_FPEN | CSR_EUEN_LSXEN | CSR_EUEN_LASXEN);
 
        kvm_restore_lasx(&vcpu->arch.fpu);
-       vcpu->arch.aux_inuse |= KVM_LARCH_LASX | KVM_LARCH_LSX | KVM_LARCH_FPU;
+       vcpu->arch.aux_inuse |= KVM_LARCH_FPU;
        trace_kvm_aux(vcpu, KVM_TRACE_AUX_RESTORE, KVM_TRACE_AUX_LASX);
 
        return 0;
@@ -1418,29 +1418,32 @@ void kvm_lose_fpu(struct kvm_vcpu *vcpu)
 {
        preempt_disable();
 
+       if (!(vcpu->arch.aux_inuse & KVM_LARCH_FPU))
+               goto done;
+
        kvm_check_fcsr_alive(vcpu);
-       if (vcpu->arch.aux_inuse & KVM_LARCH_LASX) {
+       if (kvm_guest_has_lasx(&vcpu->arch)) {
                kvm_save_lasx(&vcpu->arch.fpu);
-               vcpu->arch.aux_inuse &= ~(KVM_LARCH_LSX | KVM_LARCH_FPU | KVM_LARCH_LASX);
                trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_LASX);
 
                /* Disable LASX & LSX & FPU */
                clear_csr_euen(CSR_EUEN_FPEN | CSR_EUEN_LSXEN | CSR_EUEN_LASXEN);
-       } else if (vcpu->arch.aux_inuse & KVM_LARCH_LSX) {
+       } else if (kvm_guest_has_lsx(&vcpu->arch)) {
                kvm_save_lsx(&vcpu->arch.fpu);
-               vcpu->arch.aux_inuse &= ~(KVM_LARCH_LSX | KVM_LARCH_FPU);
                trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_LSX);
 
                /* Disable LSX & FPU */
                clear_csr_euen(CSR_EUEN_FPEN | CSR_EUEN_LSXEN);
        } else if (vcpu->arch.aux_inuse & KVM_LARCH_FPU) {
                kvm_save_fpu(&vcpu->arch.fpu);
-               vcpu->arch.aux_inuse &= ~KVM_LARCH_FPU;
                trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_FPU);
 
                /* Disable FPU */
                clear_csr_euen(CSR_EUEN_FPEN);
        }
+       vcpu->arch.aux_inuse &= ~KVM_LARCH_FPU;
+
+done:
        kvm_lose_lbt(vcpu);
 
        preempt_enable();