Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[deliverable/linux.git] / virt / kvm / arm / vgic / vgic-v2.c
index e31405ee5515b926fca839d9478e5799a54dadbd..0bf6709d1006c4bc5d148d4a3164d31b0ac96ecd 100644 (file)
@@ -124,6 +124,7 @@ void vgic_v2_fold_lr_state(struct kvm_vcpu *vcpu)
                }
 
                spin_unlock(&irq->irq_lock);
+               vgic_put_irq(vcpu->kvm, irq);
        }
 }
 
@@ -332,20 +333,25 @@ int vgic_v2_probe(const struct gic_kvm_info *info)
        vtr = readl_relaxed(kvm_vgic_global_state.vctrl_base + GICH_VTR);
        kvm_vgic_global_state.nr_lr = (vtr & 0x3f) + 1;
 
+       ret = kvm_register_vgic_device(KVM_DEV_TYPE_ARM_VGIC_V2);
+       if (ret) {
+               kvm_err("Cannot register GICv2 KVM device\n");
+               iounmap(kvm_vgic_global_state.vctrl_base);
+               return ret;
+       }
+
        ret = create_hyp_io_mappings(kvm_vgic_global_state.vctrl_base,
                                     kvm_vgic_global_state.vctrl_base +
                                         resource_size(&info->vctrl),
                                     info->vctrl.start);
-
        if (ret) {
                kvm_err("Cannot map VCTRL into hyp\n");
+               kvm_unregister_device_ops(KVM_DEV_TYPE_ARM_VGIC_V2);
                iounmap(kvm_vgic_global_state.vctrl_base);
                return ret;
        }
 
        kvm_vgic_global_state.can_emulate_gicv2 = true;
-       kvm_register_vgic_device(KVM_DEV_TYPE_ARM_VGIC_V2);
-
        kvm_vgic_global_state.vcpu_base = info->vcpu.start;
        kvm_vgic_global_state.type = VGIC_V2;
        kvm_vgic_global_state.max_gic_vcpus = VGIC_V2_MAX_CPUS;
This page took 0.025535 seconds and 5 git commands to generate.