diff options
| author | Andre Przywara <andre.przywara@arm.com> | 2016-07-15 12:43:22 +0100 | 
|---|---|---|
| committer | Marc Zyngier <marc.zyngier@arm.com> | 2016-07-18 18:09:40 +0100 | 
| commit | 8f6cdc1c2eec20c3bbf3a83ad0e1db165f709917 (patch) | |
| tree | fbc225d6e0db2124103c65bbe14834bfc6a0eda1 /virt | |
| parent | 40c4f8d27296428c894551c9e30d8016a2551116 (diff) | |
| download | linux-8f6cdc1c2eec20c3bbf3a83ad0e1db165f709917.tar.bz2 | |
KVM: arm/arm64: vgic: Move redistributor kvm_io_devices
Logically a GICv3 redistributor is assigned to a (v)CPU, so we should
aim to keep redistributor related variables out of our struct vgic_dist.
Let's start by replacing the redistributor related kvm_io_device array
with two members in our existing struct vgic_cpu, which are naturally
per-VCPU and thus don't require any allocation / freeing.
So apart from the better fit with the redistributor design this saves
some code as well.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-init.c | 1 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio-v3.c | 22 | 
2 files changed, 8 insertions, 15 deletions
| diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c index a1442f7c9c4d..90cae489c34c 100644 --- a/virt/kvm/arm/vgic/vgic-init.c +++ b/virt/kvm/arm/vgic/vgic-init.c @@ -271,7 +271,6 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm)  	dist->initialized = false;  	kfree(dist->spis); -	kfree(dist->redist_iodevs);  	dist->nr_spis = 0;  	mutex_unlock(&kvm->lock); diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c index a0c515a412a7..fc7b6c97acbb 100644 --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c @@ -285,21 +285,14 @@ unsigned int vgic_v3_init_dist_iodev(struct vgic_io_device *dev)  int vgic_register_redist_iodevs(struct kvm *kvm, gpa_t redist_base_address)  { -	int nr_vcpus = atomic_read(&kvm->online_vcpus);  	struct kvm_vcpu *vcpu; -	struct vgic_io_device *devices;  	int c, ret = 0; -	devices = kmalloc(sizeof(struct vgic_io_device) * nr_vcpus * 2, -			  GFP_KERNEL); -	if (!devices) -		return -ENOMEM; -  	kvm_for_each_vcpu(c, vcpu, kvm) {  		gpa_t rd_base = redist_base_address + c * SZ_64K * 2;  		gpa_t sgi_base = rd_base + SZ_64K; -		struct vgic_io_device *rd_dev = &devices[c * 2]; -		struct vgic_io_device *sgi_dev = &devices[c * 2 + 1]; +		struct vgic_io_device *rd_dev = &vcpu->arch.vgic_cpu.rd_iodev; +		struct vgic_io_device *sgi_dev = &vcpu->arch.vgic_cpu.sgi_iodev;  		kvm_iodevice_init(&rd_dev->dev, &kvm_io_gic_ops);  		rd_dev->base_addr = rd_base; @@ -335,14 +328,15 @@ int vgic_register_redist_iodevs(struct kvm *kvm, gpa_t redist_base_address)  	if (ret) {  		/* The current c failed, so we start with the previous one. */  		for (c--; c >= 0; c--) { +			struct vgic_cpu *vgic_cpu; + +			vcpu = kvm_get_vcpu(kvm, c); +			vgic_cpu = &vcpu->arch.vgic_cpu;  			kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, -						  &devices[c * 2].dev); +						  &vgic_cpu->rd_iodev.dev);  			kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, -						  &devices[c * 2 + 1].dev); +						  &vgic_cpu->sgi_iodev.dev);  		} -		kfree(devices); -	} else { -		kvm->arch.vgic.redist_iodevs = devices;  	}  	return ret; |