Signed-off-by: Sasha Levin <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html