[Qemu-devel] [PATCH] Fix the vm state after vm migration when vm panic

hangaohuai posted 1 patch 7 years, 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20170306140541.10600-1-hangaohuai@huawei.com
Test checkpatch passed
Test docker passed
cpus.c                  | 3 +++
include/sysemu/sysemu.h | 1 +
vl.c                    | 5 +++++
3 files changed, 9 insertions(+)
[Qemu-devel] [PATCH] Fix the vm state after vm migration when vm panic
Posted by hangaohuai 7 years, 1 month ago
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



Re: [Qemu-devel] [PATCH] Fix the vm state after vm migration when vm panic
Posted by Paolo Bonzini 7 years, 1 month ago

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();

Re: [Qemu-devel] [PATCH] Fix the vm state after vm migration when vm panic
Posted by hangaohuai 7 years, 1 month ago
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();
> .
>