From 2de82601a51d94d772dd9df0459beb42dea13387 Mon Sep 17 00:00:00 2001 From: Asias He Date: Thu, 22 Dec 2011 10:10:43 +0800 Subject: [PATCH] kvm tools: Introduce KVM_IPC_VMSTATE IPC cmd This can be used to get vm status information: vm is running or paused. Signed-off-by: Asias He Signed-off-by: Pekka Enberg --- tools/kvm/builtin-run.c | 20 +++++++++++++++++--- tools/kvm/include/kvm/kvm-ipc.h | 1 + tools/kvm/include/kvm/kvm.h | 5 +++++ tools/kvm/powerpc/include/kvm/kvm-arch.h | 1 + tools/kvm/x86/include/kvm/kvm-arch.h | 2 ++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c index a94fdbcebb7c..80806a1ae073 100644 --- a/tools/kvm/builtin-run.c +++ b/tools/kvm/builtin-run.c @@ -510,11 +510,13 @@ static void handle_pause(int fd, u32 type, u32 len, u8 *msg) if (WARN_ON(len)) return; - if (type == KVM_IPC_RESUME && is_paused) + if (type == KVM_IPC_RESUME && is_paused) { + kvm->vm_state = KVM_VMSTATE_RUNNING; kvm__continue(); - else if (type == KVM_IPC_PAUSE && !is_paused) + } else if (type == KVM_IPC_PAUSE && !is_paused) { + kvm->vm_state = KVM_VMSTATE_PAUSED; kvm__pause(); - else { + } else { WARN_ON(1); return; } @@ -523,6 +525,17 @@ static void handle_pause(int fd, u32 type, u32 len, u8 *msg) pr_info("Guest %s\n", is_paused ? "paused" : "resumed"); } +static void handle_vmstate(int fd, u32 type, u32 len, u8 *msg) +{ + int r = 0; + + if (type == KVM_IPC_VMSTATE) + r = write(fd, &kvm->vm_state, sizeof(kvm->vm_state)); + + if (r < 0) + pr_warning("Failed sending VMSTATE"); +} + static void handle_debug(int fd, u32 type, u32 len, u8 *msg) { int i; @@ -877,6 +890,7 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) kvm_ipc__register_handler(KVM_IPC_PAUSE, handle_pause); kvm_ipc__register_handler(KVM_IPC_RESUME, handle_pause); kvm_ipc__register_handler(KVM_IPC_STOP, handle_stop); + kvm_ipc__register_handler(KVM_IPC_VMSTATE, handle_vmstate); nr_online_cpus = sysconf(_SC_NPROCESSORS_ONLN); diff --git a/tools/kvm/include/kvm/kvm-ipc.h b/tools/kvm/include/kvm/kvm-ipc.h index 5916c40c21b8..aefffa4dd444 100644 --- a/tools/kvm/include/kvm/kvm-ipc.h +++ b/tools/kvm/include/kvm/kvm-ipc.h @@ -11,6 +11,7 @@ enum { KVM_IPC_RESUME = 5, KVM_IPC_STOP = 6, KVM_IPC_PID = 7, + KVM_IPC_VMSTATE = 8, }; int kvm_ipc__register_handler(u32 type, void (*cb)(int fd, u32 type, u32 len, u8 *msg)); diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h index eabaf07e6df6..d8ed73139256 100644 --- a/tools/kvm/include/kvm/kvm.h +++ b/tools/kvm/include/kvm/kvm.h @@ -21,6 +21,11 @@ .name = #ext, \ .code = ext +enum { + KVM_VMSTATE_RUNNING, + KVM_VMSTATE_PAUSED, +}; + struct kvm_ext { const char *name; int code; diff --git a/tools/kvm/powerpc/include/kvm/kvm-arch.h b/tools/kvm/powerpc/include/kvm/kvm-arch.h index 10aa2d9c2f92..c4b493c1d4f1 100644 --- a/tools/kvm/powerpc/include/kvm/kvm-arch.h +++ b/tools/kvm/powerpc/include/kvm/kvm-arch.h @@ -65,6 +65,7 @@ struct kvm { unsigned long initrd_gra; unsigned long initrd_size; const char *name; + int vm_state; }; #endif /* KVM__KVM_ARCH_H */ diff --git a/tools/kvm/x86/include/kvm/kvm-arch.h b/tools/kvm/x86/include/kvm/kvm-arch.h index 1ce3d319704d..244d36c5f75f 100644 --- a/tools/kvm/x86/include/kvm/kvm-arch.h +++ b/tools/kvm/x86/include/kvm/kvm-arch.h @@ -48,6 +48,8 @@ struct kvm { int nr_disks; const char *name; + + int vm_state; }; static inline void *guest_flat_to_host(struct kvm *kvm, unsigned long offset); /* In kvm.h */ -- 2.39.5