KVM: arm64: vgic: Let an interrupt controller advertise lack of HW deactivation
authorMarc Zyngier <maz@kernel.org>
Mon, 15 Mar 2021 21:56:47 +0000 (21:56 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 1 Jun 2021 09:45:59 +0000 (10:45 +0100)
The vGIC, as architected by ARM, allows a virtual interrupt to
trigger the deactivation of a physical interrupt. This allows
the following interrupt to be delivered without requiring an exit.

However, some implementations have choosen not to implement this,
meaning that we will need some unsavoury workarounds to deal with this.

On detecting such a case, taint the kernel and spit a nastygram.
We'll deal with this in later patches.

Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-init.c
include/kvm/arm_vgic.h
include/linux/irqchip/arm-vgic-info.h

index 6752d084934d42089b316c9a30b3b083bf1de397..340c51d87677caf9165773a7e59869aa5da002c7 100644 (file)
@@ -532,6 +532,16 @@ int kvm_vgic_hyp_init(void)
                return -ENXIO;
        }
 
+       /*
+        * If we get one of these oddball non-GICs, taint the kernel,
+        * as we have no idea of how they *really* behave.
+        */
+       if (gic_kvm_info->no_hw_deactivation) {
+               kvm_info("Non-architectural vgic, tainting kernel\n");
+               add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
+               kvm_vgic_global_state.no_hw_deactivation = true;
+       }
+
        switch (gic_kvm_info->type) {
        case GIC_V2:
                ret = vgic_v2_probe(gic_kvm_info);
index ec621180ef094c24d9a87b169d6531dcdf066987..e45b26e8d479951c8bce7c16fc2f8871ba6d7700 100644 (file)
@@ -72,6 +72,9 @@ struct vgic_global {
        bool                    has_gicv4;
        bool                    has_gicv4_1;
 
+       /* Pseudo GICv3 from outer space */
+       bool                    no_hw_deactivation;
+
        /* GIC system register CPU interface */
        struct static_key_false gicv3_cpuif;
 
index 7c0d08ebb82c784c36eaa98ed0f6529a2be39e5f..a75b2c7de69d09262946ab4aade39b46c5be6098 100644 (file)
@@ -32,6 +32,8 @@ struct gic_kvm_info {
        bool            has_v4;
        /* rvpeid support */
        bool            has_v4_1;
+       /* Deactivation impared, subpar stuff */
+       bool            no_hw_deactivation;
 };
 
 #ifdef CONFIG_KVM