Bug steps:
1. windows VM with pvpanic device:<panic model='isa'/>in xml
2. inject the panic in windows, the vm state is paused (guest-panicked)
3. migrate the vm to other host, vm state is running
Check the vmstate before runstate_set(RUN_STATE_RUNNING)
Signed-off-by: hangaohuai <hangaohuai@huawei.com>
---
cpus.c | 3 +++
include/sysemu/sysemu.h | 1 +
vl.c | 5 +++++
3 files changed, 9 insertions(+)
diff --git a/cpus.c b/cpus.c
index c857ad2..37b93aa 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1734,6 +1734,9 @@ int vm_prepare_start(void)
if (runstate_is_running()) {
qapi_event_send_stop(&error_abort);
res = -1;
+ } else if (runstate_is_paniced()) {
+ qemu_system_guest_panicked(NULL);
+ res = -1;
} else {
replay_enable_events();
cpu_enable_ticks();
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 576c7ce..08015c7 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -23,6 +23,7 @@ extern bool qemu_uuid_set;
bool runstate_check(RunState state);
void runstate_set(RunState new_state);
int runstate_is_running(void);
+int runstate_is_paniced(void);
bool runstate_needs_reset(void);
bool runstate_store(char *str, size_t size);
typedef struct vm_change_state_entry VMChangeStateEntry;
diff --git a/vl.c b/vl.c
index 16a3b5e..ea7e3f8 100644
--- a/vl.c
+++ b/vl.c
@@ -729,6 +729,11 @@ int runstate_is_running(void)
return runstate_check(RUN_STATE_RUNNING);
}
+int runstate_is_paniced(void)
+{
+ return runstate_check(RUN_STATE_GUEST_PANICKED);
+}
+
bool runstate_needs_reset(void)
{
return runstate_check(RUN_STATE_INTERNAL_ERROR) ||
--
1.8.3.1
On 06/03/2017 15:05, hangaohuai wrote: > Bug steps: > 1. windows VM with pvpanic device:<panic model='isa'/>in xml > 2. inject the panic in windows, the vm state is paused (guest-panicked) > 3. migrate the vm to other host, vm state is running > > Check the vmstate before runstate_set(RUN_STATE_RUNNING) What's the backtrace for runstate_set(RUN_STATE_RUNNING)? This should be triggered: if (!global_state_received() || global_state_get_runstate() == RUN_STATE_RUNNING) { if (autostart) { vm_start(); } else { runstate_set(RUN_STATE_PAUSED); } } else { runstate_set(global_state_get_runstate()); /* <<<< */ } I also suggest a testcase to tests/pvpanic-test.c. Paolo > Signed-off-by: hangaohuai <hangaohuai@huawei.com> > --- > cpus.c | 3 +++ > include/sysemu/sysemu.h | 1 + > vl.c | 5 +++++ > 3 files changed, 9 insertions(+) > > diff --git a/cpus.c b/cpus.c > index c857ad2..37b93aa 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -1734,6 +1734,9 @@ int vm_prepare_start(void) > if (runstate_is_running()) { > qapi_event_send_stop(&error_abort); > res = -1; > + } else if (runstate_is_paniced()) { > + qemu_system_guest_panicked(NULL); > + res = -1; > } else { > replay_enable_events(); > cpu_enable_ticks();
debugging the migration step with the same steps. with libvirt version:1.3.4 qemu version:2.8.50 I found qemu held the right state. But libvirt will send cont at the end of the migration, it will rewrite the vm's state. after migration HOSTA | HOSTB virsh list vm crashed -> virsh list vm running I will check the new libvirt about handling the state. Thanks On 2017/3/7 2:11, Paolo Bonzini wrote: > > On 06/03/2017 15:05, hangaohuai wrote: >> Bug steps: >> 1. windows VM with pvpanic device:<panic model='isa'/>in xml >> 2. inject the panic in windows, the vm state is paused (guest-panicked) >> 3. migrate the vm to other host, vm state is running >> >> Check the vmstate before runstate_set(RUN_STATE_RUNNING) > What's the backtrace for runstate_set(RUN_STATE_RUNNING)? > > This should be triggered: > > if (!global_state_received() || > global_state_get_runstate() == RUN_STATE_RUNNING) { > if (autostart) { > vm_start(); > } else { > runstate_set(RUN_STATE_PAUSED); > } > } else { > runstate_set(global_state_get_runstate()); /* <<<< */ > } > > I also suggest a testcase to tests/pvpanic-test.c. > > Paolo > >> Signed-off-by: hangaohuai <hangaohuai@huawei.com> >> --- >> cpus.c | 3 +++ >> include/sysemu/sysemu.h | 1 + >> vl.c | 5 +++++ >> 3 files changed, 9 insertions(+) >> >> diff --git a/cpus.c b/cpus.c >> index c857ad2..37b93aa 100644 >> --- a/cpus.c >> +++ b/cpus.c >> @@ -1734,6 +1734,9 @@ int vm_prepare_start(void) >> if (runstate_is_running()) { >> qapi_event_send_stop(&error_abort); >> res = -1; >> + } else if (runstate_is_paniced()) { >> + qemu_system_guest_panicked(NULL); >> + res = -1; >> } else { >> replay_enable_events(); >> cpu_enable_ticks(); > . >
© 2016 - 2024 Red Hat, Inc.