Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html