]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - virt/kvm/arm/vgic/vgic-mmio-v3.c
Merge tag 'pci-v4.12-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
[karo-tx-linux.git] / virt / kvm / arm / vgic / vgic-mmio-v3.c
index 99da1a207c19b0563030bf4ad842d8d805b1b153..201d5e2e973dd4504c1f41747b2f07bb797ade11 100644 (file)
@@ -586,7 +586,7 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu)
        if (!vgic_v3_check_base(kvm))
                return -EINVAL;
 
-       rd_base = vgic->vgic_redist_base + kvm_vcpu_get_idx(vcpu) * SZ_64K * 2;
+       rd_base = vgic->vgic_redist_base + vgic->vgic_redist_free_offset;
        sgi_base = rd_base + SZ_64K;
 
        kvm_iodevice_init(&rd_dev->dev, &kvm_io_gic_ops);
@@ -614,11 +614,15 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu)
        mutex_lock(&kvm->slots_lock);
        ret = kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, sgi_base,
                                      SZ_64K, &sgi_dev->dev);
-       mutex_unlock(&kvm->slots_lock);
-       if (ret)
+       if (ret) {
                kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS,
                                          &rd_dev->dev);
+               goto out;
+       }
 
+       vgic->vgic_redist_free_offset += 2 * SZ_64K;
+out:
+       mutex_unlock(&kvm->slots_lock);
        return ret;
 }
 
@@ -644,10 +648,12 @@ static int vgic_register_all_redist_iodevs(struct kvm *kvm)
 
        if (ret) {
                /* The current c failed, so we start with the previous one. */
+               mutex_lock(&kvm->slots_lock);
                for (c--; c >= 0; c--) {
                        vcpu = kvm_get_vcpu(kvm, c);
                        vgic_unregister_redist_iodev(vcpu);
                }
+               mutex_unlock(&kvm->slots_lock);
        }
 
        return ret;