Signed-off-by: Sasha Levin <levinsasha...@gmail.com>
---
 tools/kvm/builtin-run.c |   38 ++++++++++++++++++++++++++++++--------
 1 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c
index 524ca16..0234879 100644
--- a/tools/kvm/builtin-run.c
+++ b/tools/kvm/builtin-run.c
@@ -845,15 +845,13 @@ static void kvm_run_write_sandbox_cmd(const char **argv, 
int argc)
        close(fd);
 }
 
-int kvm_cmd_run(int argc, const char **argv, const char *prefix)
+static int kvm_cmd_run_init(int argc, const char **argv)
 {
        static char real_cmdline[2048], default_name[20];
        struct framebuffer *fb = NULL;
        unsigned int nr_online_cpus;
-       int exit_code = 0;
        int max_cpus, recommended_cpus;
        int i;
-       void *ret;
 
        signal(SIGALRM, handle_sigalrm);
        kvm_ipc__register_handler(KVM_IPC_DEBUG, handle_debug);
@@ -1132,6 +1130,14 @@ int kvm_cmd_run(int argc, const char **argv, const char 
*prefix)
        thread_pool__init(nr_online_cpus);
        ioeventfd__start();
 
+       return 0;
+}
+
+static int kvm_cmd_run_work(void)
+{
+       int i, r = -1;
+       void *ret = NULL;
+
        for (i = 0; i < nrcpus; i++) {
                if (pthread_create(&kvm_cpus[i]->thread, NULL, kvm_cpu_thread, 
kvm_cpus[i]) != 0)
                        die("unable to create KVM VCPU thread");
@@ -1139,7 +1145,7 @@ int kvm_cmd_run(int argc, const char **argv, const char 
*prefix)
 
        /* Only VCPU #0 is going to exit by itself when shutting down */
        if (pthread_join(kvm_cpus[0]->thread, &ret) != 0)
-               exit_code = 1;
+               r = 0;
 
        for (i = 1; i < nrcpus; i++) {
                if (kvm_cpus[i]->is_running) {
@@ -1147,10 +1153,15 @@ int kvm_cmd_run(int argc, const char **argv, const char 
*prefix)
                        if (pthread_join(kvm_cpus[i]->thread, &ret) != 0)
                                die("pthread_join");
                }
-               if (ret != NULL)
-                       exit_code = 1;
+               if (ret == NULL)
+                       r = 0;
        }
 
+       return r;
+}
+
+static int kvm_cmd_run_uninit(int guest_ret)
+{
        compat__print_all_messages();
 
        fb__stop();
@@ -1161,8 +1172,19 @@ int kvm_cmd_run(int argc, const char **argv, const char 
*prefix)
        disk_image__close_all(kvm->disks, image_count);
        kvm__delete(kvm);
 
-       if (!exit_code)
+       if (guest_ret == 0)
                printf("\n  # KVM session ended normally.\n");
 
-       return exit_code;
+       return 0;
+}
+
+int kvm_cmd_run(int argc, const char **argv, const char *prefix)
+{
+       int r, ret;
+
+       r = kvm_cmd_run_init(argc, argv);
+       ret = kvm_cmd_run_work();
+       r = kvm_cmd_run_uninit(ret);
+
+       return ret;
 }
-- 
1.7.8

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to