KVM: arm64: Force GICv3 trap activation when no irqchip is configured on VHE
authorMarc Zyngier <maz@kernel.org>
Tue, 27 Aug 2024 15:25:09 +0000 (16:25 +0100)
committerMarc Zyngier <maz@kernel.org>
Tue, 27 Aug 2024 17:32:55 +0000 (18:32 +0100)
On a VHE system, no GICv3 traps get configured when no irqchip is
present. This is not quite matching the "no GICv3" semantics that
we want to present.

Force such traps to be configured in this case.

Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240827152517.3909653-4-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic.c

index abe29c7d85d05a0222b2854c82d86d822480d9bb..f50274fd558156dd42cdee19ee8ad0438bda1093 100644 (file)
@@ -922,10 +922,13 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
 
 void kvm_vgic_load(struct kvm_vcpu *vcpu)
 {
-       if (unlikely(!vgic_initialized(vcpu->kvm)))
+       if (unlikely(!irqchip_in_kernel(vcpu->kvm) || !vgic_initialized(vcpu->kvm))) {
+               if (has_vhe() && static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
+                       __vgic_v3_activate_traps(&vcpu->arch.vgic_cpu.vgic_v3);
                return;
+       }
 
-       if (kvm_vgic_global_state.type == VGIC_V2)
+       if (!static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
                vgic_v2_load(vcpu);
        else
                vgic_v3_load(vcpu);
@@ -933,10 +936,13 @@ void kvm_vgic_load(struct kvm_vcpu *vcpu)
 
 void kvm_vgic_put(struct kvm_vcpu *vcpu)
 {
-       if (unlikely(!vgic_initialized(vcpu->kvm)))
+       if (unlikely(!irqchip_in_kernel(vcpu->kvm) || !vgic_initialized(vcpu->kvm))) {
+               if (has_vhe() && static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
+                       __vgic_v3_deactivate_traps(&vcpu->arch.vgic_cpu.vgic_v3);
                return;
+       }
 
-       if (kvm_vgic_global_state.type == VGIC_V2)
+       if (!static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
                vgic_v2_put(vcpu);
        else
                vgic_v3_put(vcpu);