vgic_cpu->rd_iodev.base_addr = VGIC_ADDR_UNDEF;
 }
 
-static void __kvm_vgic_destroy(struct kvm *kvm)
+void kvm_vgic_destroy(struct kvm *kvm)
 {
        struct kvm_vcpu *vcpu;
        unsigned long i;
 
-       lockdep_assert_held(&kvm->arch.config_lock);
+       mutex_lock(&kvm->slots_lock);
 
        vgic_debug_destroy(kvm);
 
        kvm_for_each_vcpu(i, vcpu, kvm)
                kvm_vgic_vcpu_destroy(vcpu);
 
+       mutex_lock(&kvm->arch.config_lock);
+
        kvm_vgic_dist_destroy(kvm);
-}
 
-void kvm_vgic_destroy(struct kvm *kvm)
-{
-       mutex_lock(&kvm->arch.config_lock);
-       __kvm_vgic_destroy(kvm);
        mutex_unlock(&kvm->arch.config_lock);
+       mutex_unlock(&kvm->slots_lock);
 }
 
 /**
                type = VGIC_V3;
        }
 
-       if (ret) {
-               __kvm_vgic_destroy(kvm);
+       if (ret)
                goto out;
-       }
+
        dist->ready = true;
        dist_base = dist->vgic_dist_base;
        mutex_unlock(&kvm->arch.config_lock);
 
        ret = vgic_register_dist_iodev(kvm, dist_base, type);
-       if (ret) {
+       if (ret)
                kvm_err("Unable to register VGIC dist MMIO regions\n");
-               kvm_vgic_destroy(kvm);
-       }
-       mutex_unlock(&kvm->slots_lock);
-       return ret;
 
+       goto out_slots;
 out:
        mutex_unlock(&kvm->arch.config_lock);
+out_slots:
        mutex_unlock(&kvm->slots_lock);
+
+       if (ret)
+               kvm_vgic_destroy(kvm);
+
        return ret;
 }