The current early init for the GIC is pretty silly. The data it initializes only matters for GICv3, which is guaranteed to be created via a kvm_create_device call. Given that, it is pointless to initialize the data early, before userspace can get a file descriptor and mess with it. Move everything to kvm_vgic_create(). Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> --- arch/arm64/kvm/arm.c | 2 -- arch/arm64/kvm/vgic/vgic-init.c | 24 +++++------------------- include/kvm/arm_vgic.h | 1 - 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 46dc3d75cf13..41f98564f507 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -120,8 +120,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) if (ret) goto out_free_stage2_pgd; - kvm_vgic_early_init(kvm); - /* The maximum number of VCPUs is limited by the host's GIC model */ kvm->arch.max_vcpus = kvm_arm_default_max_vcpus(); diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c index 8157171b8af3..76cce0db63a7 100644 --- a/arch/arm64/kvm/vgic/vgic-init.c +++ b/arch/arm64/kvm/vgic/vgic-init.c @@ -39,25 +39,6 @@ * allocation is allowed there. */ -/* EARLY INIT */ - -/** - * kvm_vgic_early_init() - Initialize static VGIC VCPU data structures - * @kvm: The VM whose VGIC districutor should be initialized - * - * Only do initialization of static structures that don't require any - * allocation or sizing information from userspace. vgic_init() called - * kvm_vgic_dist_init() which takes care of the rest. - */ -void kvm_vgic_early_init(struct kvm *kvm) -{ - struct vgic_dist *dist = &kvm->arch.vgic; - - INIT_LIST_HEAD(&dist->lpi_list_head); - INIT_LIST_HEAD(&dist->lpi_translation_cache); - raw_spin_lock_init(&dist->lpi_list_lock); -} - /* CREATION */ /** @@ -72,6 +53,7 @@ int kvm_vgic_create(struct kvm *kvm, u32 type) { int i, ret; struct kvm_vcpu *vcpu; + struct vgic_dist *dist = &kvm->arch.vgic; if (irqchip_in_kernel(kvm)) return -EEXIST; @@ -116,6 +98,10 @@ int kvm_vgic_create(struct kvm *kvm, u32 type) else INIT_LIST_HEAD(&kvm->arch.vgic.rd_regions); + INIT_LIST_HEAD(&dist->lpi_list_head); + INIT_LIST_HEAD(&dist->lpi_translation_cache); + raw_spin_lock_init(&dist->lpi_list_lock); + out_unlock: unlock_all_vcpus(kvm); return ret; diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h index 88461ecfa854..8d30fc645148 100644 --- a/include/kvm/arm_vgic.h +++ b/include/kvm/arm_vgic.h @@ -335,7 +335,6 @@ extern struct static_key_false vgic_v2_cpuif_trap; extern struct static_key_false vgic_v3_cpuif_trap; int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write); -void kvm_vgic_early_init(struct kvm *kvm); int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu); int kvm_vgic_create(struct kvm *kvm, u32 type); void kvm_vgic_destroy(struct kvm *kvm); -- 2.27.0