]> xenbits.xensource.com Git - people/julieng/linux-arm.git/commitdiff
KVM: arm/arm64: add emulation model specific destroy function
authorAndre Przywara <andre.przywara@arm.com>
Fri, 10 Jul 2015 14:21:39 +0000 (15:21 +0100)
committerJulien Grall <julien.grall@citrix.com>
Mon, 28 Sep 2015 11:05:11 +0000 (12:05 +0100)
Currently we destroy the VGIC emulation in one function that cares for
all emulated models. To be on par with init_model (which is model
specific), lets introduce a per-emulation-model destroy method, too.
Use it for a tiny GICv3 specific code already, later it will be handy
for the ITS emulation.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Eric Auger <eric.auger@linaro.org>
Signed-off-by: Vadim Lomovtsev <Vadim.Lomovtsev@caviumnetworks.com>
include/kvm/arm_vgic.h
virt/kvm/arm/vgic-v3-emul.c
virt/kvm/arm/vgic.c

index 2ccfa9aad3ec4a896c80309868d0d5ce4f8e7bbc..b18e2c56e1c9e56543fc1a29e06d511d754385fc 100644 (file)
@@ -144,6 +144,7 @@ struct vgic_vm_ops {
        bool    (*queue_sgi)(struct kvm_vcpu *, int irq);
        void    (*add_sgi_source)(struct kvm_vcpu *, int irq, int source);
        int     (*init_model)(struct kvm *);
+       void    (*destroy_model)(struct kvm *);
        int     (*map_resources)(struct kvm *, const struct vgic_params *);
 };
 
index e661e7fb9d91878a1d624b67be10d069cf248db0..d2eeb203af0942e5dda4bb7c9b1c34b29dda2062 100644 (file)
@@ -862,6 +862,14 @@ static int vgic_v3_init_model(struct kvm *kvm)
        return 0;
 }
 
+static void vgic_v3_destroy_model(struct kvm *kvm)
+{
+       struct vgic_dist *dist = &kvm->arch.vgic;
+
+       kfree(dist->irq_spi_mpidr);
+       dist->irq_spi_mpidr = NULL;
+}
+
 /* GICv3 does not keep track of SGI sources anymore. */
 static void vgic_v3_add_sgi_source(struct kvm_vcpu *vcpu, int irq, int source)
 {
@@ -874,6 +882,7 @@ void vgic_v3_init_emulation(struct kvm *kvm)
        dist->vm_ops.queue_sgi = vgic_v3_queue_sgi;
        dist->vm_ops.add_sgi_source = vgic_v3_add_sgi_source;
        dist->vm_ops.init_model = vgic_v3_init_model;
+       dist->vm_ops.destroy_model = vgic_v3_destroy_model;
        dist->vm_ops.map_resources = vgic_v3_map_resources;
 
        kvm->arch.max_vcpus = KVM_MAX_VCPUS;
index 394622c0fa0ea291d224323274f0b6727ac9afc1..cc8f5edfe89d4474584f03660d173951b76b66cf 100644 (file)
@@ -100,6 +100,14 @@ int kvm_vgic_map_resources(struct kvm *kvm)
        return kvm->arch.vgic.vm_ops.map_resources(kvm, vgic);
 }
 
+static void vgic_destroy_model(struct kvm *kvm)
+{
+       struct vgic_vm_ops *vm_ops = &kvm->arch.vgic.vm_ops;
+
+       if (vm_ops->destroy_model)
+               vm_ops->destroy_model(kvm);
+}
+
 /*
  * struct vgic_bitmap contains a bitmap made of unsigned longs, but
  * extracts u32s out of them.
@@ -1629,6 +1637,8 @@ void kvm_vgic_destroy(struct kvm *kvm)
        struct kvm_vcpu *vcpu;
        int i;
 
+       vgic_destroy_model(kvm);
+
        kvm_for_each_vcpu(i, vcpu, kvm)
                kvm_vgic_vcpu_destroy(vcpu);
 
@@ -1645,7 +1655,6 @@ void kvm_vgic_destroy(struct kvm *kvm)
        }
        kfree(dist->irq_sgi_sources);
        kfree(dist->irq_spi_cpu);
-       kfree(dist->irq_spi_mpidr);
        kfree(dist->irq_spi_target);
        kfree(dist->irq_pending_on_cpu);
        kfree(dist->irq_active_on_cpu);