From ae622771002683a9caad0253e2f87001135c0123 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Thu, 11 Aug 2011 15:43:54 +0300 Subject: [PATCH] kvm tools: Make keyboard termination go through regular termination path Instead of exiting directly when a user enters 'ctrl x + a', go through the regular termination path by stopping all VCPUs and letting the main thread handle it. Signed-off-by: Sasha Levin Signed-off-by: Pekka Enberg --- tools/kvm/builtin-run.c | 9 +++++---- tools/kvm/kvm-cpu.c | 8 ++++++-- tools/kvm/term.c | 6 +----- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c index 1ab7122c0675..4c0bb82246ba 100644 --- a/tools/kvm/builtin-run.c +++ b/tools/kvm/builtin-run.c @@ -722,10 +722,11 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) exit_code = 1; for (i = 1; i < nrcpus; i++) { - pthread_kill(kvm_cpus[i]->thread, SIGKVMEXIT); - if (pthread_join(kvm_cpus[i]->thread, &ret) != 0) - die("pthread_join"); - + if (kvm_cpus[i]->is_running) { + pthread_kill(kvm_cpus[i]->thread, SIGKVMEXIT); + if (pthread_join(kvm_cpus[i]->thread, &ret) != 0) + die("pthread_join"); + } if (ret != NULL) exit_code = 1; } diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c index 2f5d23c70ab6..fc0d6d44d9af 100644 --- a/tools/kvm/kvm-cpu.c +++ b/tools/kvm/kvm-cpu.c @@ -421,7 +421,11 @@ static void kvm_cpu__handle_coalesced_mmio(struct kvm_cpu *cpu) void kvm_cpu__reboot(void) { - pthread_kill(kvm_cpus[0]->thread, SIGKVMEXIT); + int i; + + for (i = 0; i < KVM_NR_CPUS; i++) + if (kvm_cpus[i]) + pthread_kill(kvm_cpus[i]->thread, SIGKVMEXIT); } int kvm_cpu__start(struct kvm_cpu *cpu) @@ -442,7 +446,7 @@ int kvm_cpu__start(struct kvm_cpu *cpu) if (cpu->kvm->single_step) kvm_cpu__enable_singlestep(cpu); - for (;;) { + while (cpu->is_running) { if (cpu->paused) { kvm__notify_paused(); cpu->paused = 0; diff --git a/tools/kvm/term.c b/tools/kvm/term.c index 2a3e1f0b1257..fa4382dde764 100644 --- a/tools/kvm/term.c +++ b/tools/kvm/term.c @@ -34,12 +34,8 @@ int term_getc(int who) if (term_got_escape) { term_got_escape = false; - if (c == 'x') { + if (c == 'x') kvm_cpu__reboot(); - kvm__delete(kvm); - printf("\n # KVM session terminated.\n"); - exit(1); - } if (c == term_escape_char) return c; } -- 2.39.5