[libvirt] [PATCH 0/4] qemu: Use additional data reported by the hyperv panic notifier

Allow easier debug of windows crashes by reporting the 5 additional field now reported by qemu if the hyperv panic notifier is used. Plus few cleanups noticed while adding the code. Peter Krempa (4): qemu: driver: Remove useless forward declarations qemu: driver: Fix formatting in processGuestPanicEvent qemu: monitor: Extract additional info from GUEST_PANICKED event qemu: Log additional data from hyperv crash notifier src/qemu/qemu_driver.c | 81 +++++++++++++++++++++++++++++++------------- src/qemu/qemu_monitor.c | 15 ++++++-- src/qemu/qemu_monitor.h | 32 ++++++++++++++++- src/qemu/qemu_monitor_json.c | 56 ++++++++++++++++++++++++++++-- src/qemu/qemu_process.c | 2 ++ 5 files changed, 157 insertions(+), 29 deletions(-) -- 2.12.0

--- src/qemu/qemu_driver.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index dcd823f53..41992158f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -136,14 +136,6 @@ VIR_LOG_INIT("qemu.qemu_driver"); #define QEMU_NB_BANDWIDTH_PARAM 7 -static void processWatchdogEvent(virQEMUDriverPtr driver, - virDomainObjPtr vm, - int action); - -static void processGuestPanicEvent(virQEMUDriverPtr driver, - virDomainObjPtr vm, - int action); - static void qemuProcessEventHandler(void *data, void *opaque); static int qemuStateCleanup(void); @@ -154,16 +146,9 @@ static int qemuDomainObjStart(virConnectPtr conn, unsigned int flags, qemuDomainAsyncJob asyncJob); -static int qemuDomainGetMaxVcpus(virDomainPtr dom); - static int qemuDomainManagedSaveLoad(virDomainObjPtr vm, void *opaque); -static int qemuOpenFile(virQEMUDriverPtr driver, - virDomainObjPtr vm, - const char *path, int oflags, - bool *needUnlink, bool *bypassSecurityDriver); - static int qemuOpenFileAs(uid_t fallback_uid, gid_t fallback_gid, bool dynamicOwnership, const char *path, int oflags, -- 2.12.0

--- src/qemu/qemu_driver.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 41992158f..ab7c01b23 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3990,13 +3990,11 @@ processGuestPanicEvent(virQEMUDriverPtr driver, goto endjob; } - virDomainObjSetState(vm, - VIR_DOMAIN_CRASHED, - VIR_DOMAIN_CRASHED_PANICKED); + virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED); event = virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_CRASHED, - VIR_DOMAIN_EVENT_CRASHED_PANICKED); + VIR_DOMAIN_EVENT_CRASHED, + VIR_DOMAIN_EVENT_CRASHED_PANICKED); qemuDomainEventQueue(driver, event); @@ -4019,8 +4017,8 @@ processGuestPanicEvent(virQEMUDriverPtr driver, qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED, QEMU_ASYNC_JOB_DUMP, 0); event = virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_STOPPED, - VIR_DOMAIN_EVENT_STOPPED_CRASHED); + VIR_DOMAIN_EVENT_STOPPED, + VIR_DOMAIN_EVENT_STOPPED_CRASHED); qemuDomainEventQueue(driver, event); virDomainAuditStop(vm, "destroyed"); -- 2.12.0

For certain kinds of panic notifiers (notably hyper-v) qemu is able to report some data regarding the crash passed from the guest. Make the data accessible to the callback in qemu so that it can be processed further. --- src/qemu/qemu_monitor.c | 15 ++++++++++-- src/qemu/qemu_monitor.h | 32 ++++++++++++++++++++++++- src/qemu/qemu_monitor_json.c | 56 ++++++++++++++++++++++++++++++++++++++++++-- src/qemu/qemu_process.c | 2 ++ 4 files changed, 100 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 79da47237..4a7e71e8f 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1359,11 +1359,12 @@ qemuMonitorEmitResume(qemuMonitorPtr mon) int -qemuMonitorEmitGuestPanic(qemuMonitorPtr mon) +qemuMonitorEmitGuestPanic(qemuMonitorPtr mon, + qemuMonitorEventPanicInfoPtr info) { int ret = -1; VIR_DEBUG("mon=%p", mon); - QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm); + QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm, info); return ret; } @@ -4184,3 +4185,13 @@ qemuMonitorQueryQMPSchema(qemuMonitorPtr mon) return qemuMonitorJSONQueryQMPSchema(mon); } + + +void +qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicInfoPtr info) +{ + if (!info) + return; + + VIR_FREE(info); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c3d3f2fb3..c4d247e79 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -70,6 +70,34 @@ struct _qemuMonitorMessage { void *passwordOpaque; }; +typedef enum { + QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE = 0, + QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV, + + QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST +} qemuMonitorEventPanicInfoType; + +typedef struct _qemuMonitorEventPanicInfoHyperv qemuMonitorEventPanicInfoHyperv; +typedef qemuMonitorEventPanicInfoHyperv *qemuMonitorEventPanicInfoHypervPtr; +struct _qemuMonitorEventPanicInfoHyperv { + /* Hyper-V specific guest panic information (HV crash MSRs) */ + unsigned long long arg1; + unsigned long long arg2; + unsigned long long arg3; + unsigned long long arg4; + unsigned long long arg5; +}; + +typedef struct _qemuMonitorEventPanicInfo qemuMonitorEventPanicInfo; +typedef qemuMonitorEventPanicInfo *qemuMonitorEventPanicInfoPtr; +struct _qemuMonitorEventPanicInfo { + qemuMonitorEventPanicInfoType type; + union { + qemuMonitorEventPanicInfoHyperv hyperv; + } data; +}; + +void qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicInfoPtr info); typedef void (*qemuMonitorDestroyCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, @@ -167,6 +195,7 @@ typedef int (*qemuMonitorDomainPMSuspendDiskCallback)(qemuMonitorPtr mon, void *opaque); typedef int (*qemuMonitorDomainGuestPanicCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, + qemuMonitorEventPanicInfoPtr info, void *opaque); typedef int (*qemuMonitorDomainDeviceDeletedCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, @@ -337,7 +366,8 @@ int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon, unsigned long long actual); int qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon); -int qemuMonitorEmitGuestPanic(qemuMonitorPtr mon); +int qemuMonitorEmitGuestPanic(qemuMonitorPtr mon, + qemuMonitorEventPanicInfoPtr info); int qemuMonitorEmitDeviceDeleted(qemuMonitorPtr mon, const char *devAlias); int qemuMonitorEmitNicRxFilterChanged(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 553544aea..d75748bd8 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -546,11 +546,63 @@ static void qemuMonitorJSONHandleResume(qemuMonitorPtr mon, virJSONValuePtr data qemuMonitorEmitResume(mon); } -static void qemuMonitorJSONHandleGuestPanic(qemuMonitorPtr mon, virJSONValuePtr data ATTRIBUTE_UNUSED) + +static qemuMonitorEventPanicInfoPtr +qemuMonitorJSONGuestPanicExtractInfoHyperv(virJSONValuePtr data) +{ + qemuMonitorEventPanicInfoPtr ret; + + if (VIR_ALLOC(ret) < 0) + return NULL; + + ret->type = QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV; + + if (virJSONValueObjectGetNumberUlong(data, "arg1", &ret->data.hyperv.arg1) < 0 || + virJSONValueObjectGetNumberUlong(data, "arg2", &ret->data.hyperv.arg2) < 0 || + virJSONValueObjectGetNumberUlong(data, "arg3", &ret->data.hyperv.arg3) < 0 || + virJSONValueObjectGetNumberUlong(data, "arg4", &ret->data.hyperv.arg4) < 0 || + virJSONValueObjectGetNumberUlong(data, "arg5", &ret->data.hyperv.arg5) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed hyperv panic data")); + goto error; + } + + return ret; + + error: + qemuMonitorEventPanicInfoFree(ret); + return NULL; +} + + +static qemuMonitorEventPanicInfoPtr +qemuMonitorJSONGuestPanicExtractInfo(virJSONValuePtr data) { - qemuMonitorEmitGuestPanic(mon); + const char *type = virJSONValueObjectGetString(data, "type"); + + if (STREQ_NULLABLE(type, "hyper-v")) + return qemuMonitorJSONGuestPanicExtractInfoHyperv(data); + + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown panic info type '%s'"), NULLSTR(type)); + return NULL; } + +static void +qemuMonitorJSONHandleGuestPanic(qemuMonitorPtr mon, + virJSONValuePtr data) +{ + virJSONValuePtr infojson = virJSONValueObjectGetObject(data, "info"); + qemuMonitorEventPanicInfoPtr info = NULL; + + if (infojson) + info = qemuMonitorJSONGuestPanicExtractInfo(infojson); + + qemuMonitorEmitGuestPanic(mon, info); +} + + static void qemuMonitorJSONHandleRTCChange(qemuMonitorPtr mon, virJSONValuePtr data) { long long offset = 0; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ec0e36d2e..6a73dd464 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1297,6 +1297,7 @@ qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandleGuestPanic(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, + qemuMonitorEventPanicInfoPtr info, void *opaque) { virQEMUDriverPtr driver = opaque; @@ -1309,6 +1310,7 @@ qemuProcessHandleGuestPanic(qemuMonitorPtr mon ATTRIBUTE_UNUSED, processEvent->eventType = QEMU_PROCESS_EVENT_GUESTPANIC; processEvent->action = vm->def->onCrash; processEvent->vm = vm; + processEvent->data = info; /* Hold an extra reference because we can't allow 'vm' to be * deleted before handling guest panic event is finished. */ -- 2.12.0

On Tue, Mar 21, 2017 at 08:47:49 +0100, Peter Krempa wrote:
For certain kinds of panic notifiers (notably hyper-v) qemu is able to report some data regarding the crash passed from the guest.
Make the data accessible to the callback in qemu so that it can be processed further. --- src/qemu/qemu_monitor.c | 15 ++++++++++-- src/qemu/qemu_monitor.h | 32 ++++++++++++++++++++++++- src/qemu/qemu_monitor_json.c | 56 ++++++++++++++++++++++++++++++++++++++++++-- src/qemu/qemu_process.c | 2 ++ 4 files changed, 100 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 79da47237..4a7e71e8f 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1359,11 +1359,12 @@ qemuMonitorEmitResume(qemuMonitorPtr mon)
int -qemuMonitorEmitGuestPanic(qemuMonitorPtr mon) +qemuMonitorEmitGuestPanic(qemuMonitorPtr mon, + qemuMonitorEventPanicInfoPtr info) { int ret = -1; VIR_DEBUG("mon=%p", mon); - QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm); + QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm, info); return ret; }
@@ -4184,3 +4185,13 @@ qemuMonitorQueryQMPSchema(qemuMonitorPtr mon)
return qemuMonitorJSONQueryQMPSchema(mon); } + + +void +qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicInfoPtr info) +{ + if (!info) + return;
This check is redundant... unless you add more staff in the structure which would need to be explicitly freed here.
+ + VIR_FREE(info); +}
ACK Jirka

The hyperv panic notifier reports additional data in form of 5 registers that are reported in the crash event from qemu. Log them into the VM log file and report them as a warning so that admins can see the cause of crash of their windows VMs. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1426176 --- src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ab7c01b23..c558e0991 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3971,10 +3971,56 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, return ret; } + +static char * +qemuProcessGuestPanicEventInfoFormatData(qemuMonitorEventPanicInfoPtr info) +{ + char *ret = NULL; + + switch (info->type) { + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV: + ignore_value(virAsprintf(&ret, "hyper-v: arg1='0x%llx', arg2='0x%llx', " + "arg3='0x%llx', arg4='0x%llx', " + "arg5='0x%llx'", + info->data.hyperv.arg1, + info->data.hyperv.arg2, + info->data.hyperv.arg3, + info->data.hyperv.arg4, + info->data.hyperv.arg5)); + break; + + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE: + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST: + break; + } + + return ret; +} + + +static void +qemuProcessGuestPanicEventInfo(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuMonitorEventPanicInfoPtr info) +{ + char *msg = qemuProcessGuestPanicEventInfoFormatData(info); + char *timestamp = virTimeStringNow(); + + if (msg && timestamp) { + qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg); + VIR_WARN("domain '%s' panic data: %s", vm->def->name, msg); + } + + VIR_FREE(timestamp); + VIR_FREE(msg); +} + + static void processGuestPanicEvent(virQEMUDriverPtr driver, virDomainObjPtr vm, - int action) + int action, + qemuMonitorEventPanicInfoPtr info) { qemuDomainObjPrivatePtr priv = vm->privateData; virObjectEventPtr event = NULL; @@ -3990,6 +4036,9 @@ processGuestPanicEvent(virQEMUDriverPtr driver, goto endjob; } + if (info) + qemuProcessGuestPanicEventInfo(driver, vm, info); + virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED); event = virDomainEventLifecycleNewFromObj(vm, @@ -4567,7 +4616,8 @@ static void qemuProcessEventHandler(void *data, void *opaque) processWatchdogEvent(driver, vm, processEvent->action); break; case QEMU_PROCESS_EVENT_GUESTPANIC: - processGuestPanicEvent(driver, vm, processEvent->action); + processGuestPanicEvent(driver, vm, processEvent->action, + processEvent->data); break; case QEMU_PROCESS_EVENT_DEVICE_DELETED: processDeviceDeletedEvent(driver, vm, processEvent->data); -- 2.12.0

On Tue, Mar 21, 2017 at 08:47:50 +0100, Peter Krempa wrote:
The hyperv panic notifier reports additional data in form of 5 registers that are reported in the crash event from qemu. Log them into the VM log file and report them as a warning so that admins can see the cause of crash of their windows VMs.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1426176 --- src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ab7c01b23..c558e0991 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3971,10 +3971,56 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, return ret; }
+ +static char * +qemuProcessGuestPanicEventInfoFormatData(qemuMonitorEventPanicInfoPtr info)
I think this should be implemented in qemu_monitor.c as qemuMonitorEventPanicInfoFormat so that it's closer the structure is defined.
+{ + char *ret = NULL; + + switch (info->type) { + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV: + ignore_value(virAsprintf(&ret, "hyper-v: arg1='0x%llx', arg2='0x%llx', " + "arg3='0x%llx', arg4='0x%llx', " + "arg5='0x%llx'", + info->data.hyperv.arg1, + info->data.hyperv.arg2, + info->data.hyperv.arg3, + info->data.hyperv.arg4, + info->data.hyperv.arg5));
Wrong indentation, the additional lines should be aligned with &ret :-)
+ break; + + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE: + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST: + break; + } + + return ret; +} + + +static void +qemuProcessGuestPanicEventInfo(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuMonitorEventPanicInfoPtr info) +{ + char *msg = qemuProcessGuestPanicEventInfoFormatData(info); + char *timestamp = virTimeStringNow(); + + if (msg && timestamp) { + qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg); + VIR_WARN("domain '%s' panic data: %s", vm->def->name, msg);
Do we really need this warning? Especially when a guest panic triggers the warning only if we have the additional data to report. We should either emit the warning in all cases or never. I think we should just drop the warning. Jirka

The hyperv panic notifier reports additional data in form of 5 registers that are reported in the crash event from qemu. Log them into the VM log file and report them as a warning so that admins can see the cause of crash of their windows VMs. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1426176 --- src/qemu/qemu_driver.c | 26 ++++++++++++++++++++++++-- src/qemu/qemu_monitor.c | 24 ++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 1 + 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6db325494..d5fc00eba 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3971,10 +3971,28 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, return ret; } + +static void +qemuProcessGuestPanicEventInfo(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuMonitorEventPanicInfoPtr info) +{ + char *msg = qemuMonitorGuestPanicEventInfoFormatMsg(info); + char *timestamp = virTimeStringNow(); + + if (msg && timestamp) + qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg); + + VIR_FREE(timestamp); + VIR_FREE(msg); +} + + static void processGuestPanicEvent(virQEMUDriverPtr driver, virDomainObjPtr vm, - int action) + int action, + qemuMonitorEventPanicInfoPtr info) { qemuDomainObjPrivatePtr priv = vm->privateData; virObjectEventPtr event = NULL; @@ -3990,6 +4008,9 @@ processGuestPanicEvent(virQEMUDriverPtr driver, goto endjob; } + if (info) + qemuProcessGuestPanicEventInfo(driver, vm, info); + virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED); event = virDomainEventLifecycleNewFromObj(vm, @@ -4567,7 +4588,8 @@ static void qemuProcessEventHandler(void *data, void *opaque) processWatchdogEvent(driver, vm, processEvent->action); break; case QEMU_PROCESS_EVENT_GUESTPANIC: - processGuestPanicEvent(driver, vm, processEvent->action); + processGuestPanicEvent(driver, vm, processEvent->action, + processEvent->data); break; case QEMU_PROCESS_EVENT_DEVICE_DELETED: processDeviceDeletedEvent(driver, vm, processEvent->data); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 7905343a5..ca0b2c3b3 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4243,6 +4243,30 @@ qemuMonitorQueryNamedBlockNodes(qemuMonitorPtr mon) } +char * +qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorEventPanicInfoPtr info) +{ + char *ret = NULL; + + switch (info->type) { + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV: + ignore_value(virAsprintf(&ret, "hyper-v: arg1='0x%llx', arg2='0x%llx', " + "arg3='0x%llx', arg4='0x%llx', " + "arg5='0x%llx'", + info->data.hyperv.arg1, info->data.hyperv.arg2, + info->data.hyperv.arg3, info->data.hyperv.arg4, + info->data.hyperv.arg5)); + break; + + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE: + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST: + break; + } + + return ret; +} + + void qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicInfoPtr info) { diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index ad1e96276..87a1496cf 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -97,6 +97,7 @@ struct _qemuMonitorEventPanicInfo { } data; }; +char *qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorEventPanicInfoPtr info); void qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicInfoPtr info); typedef void (*qemuMonitorDestroyCallback)(qemuMonitorPtr mon, -- 2.12.1

On Mon, Mar 27, 2017 at 16:10:55 +0200, Peter Krempa wrote:
The hyperv panic notifier reports additional data in form of 5 registers that are reported in the crash event from qemu. Log them into the VM log file and report them as a warning so that admins can see the cause of crash of their windows VMs.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1426176 --- src/qemu/qemu_driver.c | 26 ++++++++++++++++++++++++-- src/qemu/qemu_monitor.c | 24 ++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 1 + 3 files changed, 49 insertions(+), 2 deletions(-)
ACK Jirka
participants (2)
-
Jiri Denemark
-
Peter Krempa