KVM: arm64: GICv4.1: Reload VLPI configuration on distributor enable/disable
Each time a Group-enable bit gets flipped, the state of these bits needs to be forwarded to the hardware. This is a pretty heavy handed operation, requiring all vcpus to reload their GICv4 configuration. It is thus implemented as a new request type. These enable bits are programmed into the HW by setting the VGrp{0,1}En fields of GICR_VPENDBASER when the vPEs are made resident again. Of course, we only support Group-1 for now... Signed-off-by: Marc Zyngier <maz@kernel.org> Reviewed-by: Zenghui Yu <yuzenghui@huawei.com> Link: https://lore.kernel.org/r/20200304203330.4967-22-maz@kernel.org
This commit is contained in:
parent
2291ff2f2a
commit
d9c3872cd2
@ -39,6 +39,7 @@
|
|||||||
#define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1)
|
#define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1)
|
||||||
#define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2)
|
#define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2)
|
||||||
#define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3)
|
#define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3)
|
||||||
|
#define KVM_REQ_RELOAD_GICv4 KVM_ARCH_REQ(4)
|
||||||
|
|
||||||
DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
|
DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1)
|
#define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1)
|
||||||
#define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2)
|
#define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2)
|
||||||
#define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3)
|
#define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3)
|
||||||
|
#define KVM_REQ_RELOAD_GICv4 KVM_ARCH_REQ(4)
|
||||||
|
|
||||||
DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
|
DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
|
||||||
|
|
||||||
|
@ -625,6 +625,14 @@ static void check_vcpu_requests(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
if (kvm_check_request(KVM_REQ_RECORD_STEAL, vcpu))
|
if (kvm_check_request(KVM_REQ_RECORD_STEAL, vcpu))
|
||||||
kvm_update_stolen_time(vcpu);
|
kvm_update_stolen_time(vcpu);
|
||||||
|
|
||||||
|
if (kvm_check_request(KVM_REQ_RELOAD_GICv4, vcpu)) {
|
||||||
|
/* The distributor enable bits were changed */
|
||||||
|
preempt_disable();
|
||||||
|
vgic_v4_put(vcpu, false);
|
||||||
|
vgic_v4_load(vcpu);
|
||||||
|
preempt_enable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,10 @@ static void vgic_mmio_write_v3_misc(struct kvm_vcpu *vcpu,
|
|||||||
if (is_hwsgi != dist->nassgireq)
|
if (is_hwsgi != dist->nassgireq)
|
||||||
vgic_v4_configure_vsgis(vcpu->kvm);
|
vgic_v4_configure_vsgis(vcpu->kvm);
|
||||||
|
|
||||||
if (!was_enabled && dist->enabled)
|
if (kvm_vgic_global_state.has_gicv4_1 &&
|
||||||
|
was_enabled != dist->enabled)
|
||||||
|
kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_RELOAD_GICv4);
|
||||||
|
else if (!was_enabled && dist->enabled)
|
||||||
vgic_kick_vcpus(vcpu->kvm);
|
vgic_kick_vcpus(vcpu->kvm);
|
||||||
|
|
||||||
mutex_unlock(&vcpu->kvm->lock);
|
mutex_unlock(&vcpu->kvm->lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user