From: wanghaibin <wanghaibin.wang@huawei.com> Let's start the VGIC split by moving the act of destroying it, as it is simple and doesn't require much effort. Whilst we're at it, make kvm_vgic_vcpu_destroy() static, as it isn't called from anywhere else. fix: vcpu_destroy called form arm.c now, so abstract it; Signed-off-by: Marc Zyngier <maz@kernel.org> Signed-off-by: wanghaibin <wanghaibin.wang@huawei.com> --- arch/arm64/include/asm/kvm_irq.h | 9 +++++++++ arch/arm64/kvm/arm.c | 6 +++--- arch/arm64/kvm/vgic/vgic-init.c | 9 +++++++-- include/kvm/arm_vgic.h | 2 -- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/kvm_irq.h b/arch/arm64/include/asm/kvm_irq.h index 7a70bb803560..42d110155627 100644 --- a/arch/arm64/include/asm/kvm_irq.h +++ b/arch/arm64/include/asm/kvm_irq.h @@ -18,6 +18,8 @@ enum kvm_irqchip_type { #define irqchip_is_gic_v3(k) ((k)->arch.irqchip_type == IRQCHIP_GICv3) struct kvm_irqchip_flow { + void (*irqchip_destroy)(struct kvm *); + void (*irqchip_vcpu_destroy)(struct kvm_vcpu *vcpu); }; /* @@ -46,4 +48,11 @@ struct kvm_irqchip_flow { #define __vcpu_irqchip_action_ret(v, ...) \ __kvm_irqchip_action_ret((v)->kvm, __VA_ARGS__) + +#define kvm_irqchip_destroy(k) \ + __kvm_irqchip_action((k), destroy, (k)) + +#define kvm_irqchip_vcpu_destroy(v) \ + __vcpu_irqchip_action((v), vcpu_destroy, (v)) + #endif diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 39c779084430..9a21a064afb3 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -402,7 +402,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm) bitmap_free(kvm->arch.pmu_filter); free_cpumask_var(kvm->arch.supported_cpus); - kvm_vgic_destroy(kvm); + kvm_irqchip_destroy(kvm); if (is_protected_kvm_enabled()) pkvm_destroy_hyp_vm(kvm); @@ -661,7 +661,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) kvm_sched_affinity_vcpu_destroy(vcpu); vgic_vcpu_destroy: - kvm_vgic_vcpu_destroy(vcpu); + kvm_irqchip_vcpu_destroy(vcpu); return err; } @@ -675,7 +675,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache); kvm_timer_vcpu_terminate(vcpu); kvm_pmu_vcpu_destroy(vcpu); - kvm_vgic_vcpu_destroy(vcpu); + kvm_irqchip_vcpu_destroy(vcpu); kvm_arm_vcpu_destroy(vcpu); kvm_sched_affinity_vcpu_destroy(vcpu); diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c index be105bb97cb8..0c8972404b79 100644 --- a/arch/arm64/kvm/vgic/vgic-init.c +++ b/arch/arm64/kvm/vgic/vgic-init.c @@ -18,7 +18,12 @@ #include "hisilicon/hisi_virt.h" #endif +static void kvm_vgic_destroy(struct kvm *kvm); +static void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu); + static struct kvm_irqchip_flow vgic_irqchip_flow = { + .irqchip_destroy = kvm_vgic_destroy, + .irqchip_vcpu_destroy = kvm_vgic_vcpu_destroy, }; /* @@ -426,7 +431,7 @@ static void __kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) } } -void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) +static void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) { struct kvm *kvm = vcpu->kvm; @@ -435,7 +440,7 @@ void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) mutex_unlock(&kvm->slots_lock); } -void kvm_vgic_destroy(struct kvm *kvm) +static void kvm_vgic_destroy(struct kvm *kvm) { struct kvm_vcpu *vcpu; unsigned long i; diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h index ad78351fa905..6b650434e499 100644 --- a/include/kvm/arm_vgic.h +++ b/include/kvm/arm_vgic.h @@ -444,8 +444,6 @@ extern struct static_key_false vgic_v3_cpuif_trap; int kvm_set_legacy_vgic_v2_addr(struct kvm *kvm, struct kvm_arm_device_addr *dev_addr); 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); -void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu); int kvm_vgic_map_resources(struct kvm *kvm); int kvm_vgic_hyp_init(void); void kvm_vgic_init_cpu_hardware(void); -- 2.33.0