On 11/1/23 18:13, Denis V. Lunev wrote: > On 11/1/23 16:23, Andrey Drobyshev wrote: >> Currently we emit GUEST_PANICKED event in case kvm_vcpu_ioctl() returns >> KVM_EXIT_SYSTEM_EVENT with the event type KVM_SYSTEM_EVENT_CRASH. Let's >> extend this scenario and emit GUEST_PANICKED in case of an abnormal KVM >> exit. That's a natural thing to do since in this case guest is no >> longer operational anyway. >> >> Signed-off-by: Andrey Drobyshev <andrey.drobys...@virtuozzo.com> >> Acked-by: Denis V. Lunev <d...@virtuozzo.com> >> --- >> accel/kvm/kvm-all.c | 19 +++++++++++++++---- >> 1 file changed, 15 insertions(+), 4 deletions(-) >> >> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c >> index e39a810a4e..d74b3f0b0e 100644 >> --- a/accel/kvm/kvm-all.c >> +++ b/accel/kvm/kvm-all.c >> @@ -2816,6 +2816,14 @@ static void kvm_eat_signals(CPUState *cpu) >> } while (sigismember(&chkset, SIG_IPI)); >> } >> +static void kvm_emit_guest_crash(CPUState *cpu) >> +{ >> + kvm_cpu_synchronize_state(cpu); >> + qemu_mutex_lock_iothread(); >> + qemu_system_guest_panicked(cpu_get_crash_info(cpu)); >> + qemu_mutex_unlock_iothread(); >> +} >> + >> int kvm_cpu_exec(CPUState *cpu) >> { >> struct kvm_run *run = cpu->kvm_run; >> @@ -2969,21 +2977,24 @@ int kvm_cpu_exec(CPUState *cpu) >> ret = EXCP_INTERRUPT; >> break; >> case KVM_SYSTEM_EVENT_CRASH: >> - kvm_cpu_synchronize_state(cpu); >> - qemu_mutex_lock_iothread(); >> - qemu_system_guest_panicked(cpu_get_crash_info(cpu)); >> - qemu_mutex_unlock_iothread(); >> + kvm_emit_guest_crash(cpu); >> ret = 0; >> break; >> default: >> DPRINTF("kvm_arch_handle_exit\n"); >> ret = kvm_arch_handle_exit(cpu, run); >> + if (ret < 0) { >> + kvm_emit_guest_crash(cpu); >> + } >> break; >> } >> break; >> default: >> DPRINTF("kvm_arch_handle_exit\n"); >> ret = kvm_arch_handle_exit(cpu, run); >> + if (ret < 0) { >> + kvm_emit_guest_crash(cpu); >> + } >> break; >> } >> } while (ret == 0); > This allows to gracefully handle this problem in production > and reset the guest using on_crash action in libvirt.
Ping