int r;
        int cpu;
 
-       r = kvm_arch_init(opaque);
-       if (r)
-               goto out_fail;
-
        /*
-        * kvm_arch_init makes sure there's at most one caller
-        * for architectures that support multiple implementations,
-        * like intel and amd on x86.
-        * kvm_arch_init must be called before kvm_irqfd_init to avoid creating
-        * conflicts in case kvm is already setup for another implementation.
+        * FIXME: Get rid of kvm_arch_init(), vendor code should call arch code
+        * directly.  Note, kvm_arch_init() _must_ be called before anything
+        * else as x86 relies on checks buried in kvm_arch_init() to guard
+        * against multiple calls to kvm_init().
         */
-       r = kvm_irqfd_init();
+       r = kvm_arch_init(opaque);
        if (r)
-               goto out_irqfd;
+               return r;
 
        if (!zalloc_cpumask_var(&cpus_hardware_enabled, GFP_KERNEL)) {
                r = -ENOMEM;
-               goto out_free_0;
+               goto err_hw_enabled;
        }
 
        r = kvm_arch_hardware_setup(opaque);
                }
        }
 
+       r = kvm_irqfd_init();
+       if (r)
+               goto err_irqfd;
+
        r = kvm_async_pf_init();
        if (r)
-               goto out_free_4;
+               goto err_async_pf;
 
        kvm_chardev_ops.owner = module;
 
        kvm_vfio_ops_exit();
 err_vfio:
        kvm_async_pf_deinit();
+err_async_pf:
+       kvm_irqfd_exit();
+err_irqfd:
 out_free_4:
        for_each_possible_cpu(cpu)
                free_cpumask_var(per_cpu(cpu_kick_mask, cpu));
        kvm_arch_hardware_unsetup();
 out_free_1:
        free_cpumask_var(cpus_hardware_enabled);
-out_free_0:
-       kvm_irqfd_exit();
-out_irqfd:
+err_hw_enabled:
        kvm_arch_exit();
-out_fail:
        return r;
 }
 EXPORT_SYMBOL_GPL(kvm_init);
        unregister_reboot_notifier(&kvm_reboot_notifier);
        cpuhp_remove_state_nocalls(CPUHP_AP_KVM_STARTING);
        on_each_cpu(hardware_disable_nolock, NULL, 1);
+       kvm_irqfd_exit();
        kvm_arch_hardware_unsetup();
        kvm_arch_exit();
-       kvm_irqfd_exit();
        free_cpumask_var(cpus_hardware_enabled);
        kvm_vfio_ops_exit();
 }