[libvirt] [PATCH v5 2/5] qemu: Supports guest panicked
Eric Blake
eblake at redhat.com
Wed Jun 5 22:32:09 UTC 2013
On 06/05/2013 03:54 AM, Chen Fan wrote:
> Add monitor callback API domainGUESTPanicked, that
> implements the 'on_crash' behavior in the XML when domain crashed.
> ---
> src/qemu/qemu_monitor.c | 14 +++++-
> src/qemu/qemu_monitor.h | 5 +++
> src/qemu/qemu_monitor_json.c | 7 +++
> src/qemu/qemu_process.c | 103 ++++++++++++++++++++++++++++++++++++++++++-
> 4 files changed, 127 insertions(+), 2 deletions(-)
>
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 4e35f79..e0cd62c 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -113,7 +113,7 @@ VIR_ENUM_IMPL(qemuMonitorVMStatus,
> QEMU_MONITOR_VM_STATUS_LAST,
> "debug", "inmigrate", "internal-error", "io-error", "paused",
> "postmigrate", "prelaunch", "finish-migrate", "restore-vm",
> - "running", "save-vm", "shutdown", "watchdog")
> + "running", "save-vm", "shutdown", "watchdog", "guest-panicked")
If this is internal-only, can we use the shorter name 'guest-panic'?
>
> typedef enum {
> QEMU_MONITOR_BLOCK_IO_STATUS_OK,
> @@ -1032,6 +1032,15 @@ int qemuMonitorEmitResume(qemuMonitorPtr mon)
> }
>
>
> +int qemuMonitorEmitGUESTPanicked(qemuMonitorPtr mon)
WHY THE ALL CAPS? qemuMonitorEmitGuestPanic() is sufficient for naming
purposes.
> +{
> + int ret = -1;
> + VIR_DEBUG("mon=%p", mon);
> + QEMU_MONITOR_CALLBACK(mon, ret, domainGUESTPanicked, mon->vm);
> + return ret;
> +}
> +
> +
> int qemuMonitorEmitRTCChange(qemuMonitorPtr mon, long long offset)
If it was because of copy-and-paste, remember that RTC is an acronym,
but Guest is not.
> +++ b/src/qemu/qemu_monitor.h
> @@ -140,6 +140,8 @@ struct _qemuMonitorCallbacks {
> unsigned long long actual);
> int (*domainPMSuspendDisk)(qemuMonitorPtr mon,
> virDomainObjPtr vm);
> + int (*domainGUESTPanicked)(qemuMonitorPtr mon,
Again, s/GUEST/Guest/
> + virDomainObjPtr vm);
> };
>
> char *qemuMonitorEscapeArg(const char *in);
> @@ -220,6 +222,8 @@ int qemuMonitorEmitBlockJob(qemuMonitorPtr mon,
> int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
> unsigned long long actual);
> int qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon);
> +int qemuMonitorEmitGUESTPanicked(qemuMonitorPtr mon);
and again.
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -74,6 +74,7 @@ static void qemuMonitorJSONHandleBlockJobCanceled(qemuMonitorPtr mon, virJSONVal
> static void qemuMonitorJSONHandleBlockJobReady(qemuMonitorPtr mon, virJSONValuePtr data);
> static void qemuMonitorJSONHandleBalloonChange(qemuMonitorPtr mon, virJSONValuePtr data);
> static void qemuMonitorJSONHandlePMSuspendDisk(qemuMonitorPtr mon, virJSONValuePtr data);
> +static void qemuMonitorJSONHandleGUESTPanicked(qemuMonitorPtr mon, virJSONValuePtr data);
and again
> +static int
> +qemuProcessHandleGUESTPanicked(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
> + virDomainObjPtr vm)
> +{
> +
> + if (vm->def->onCrash == VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE) {
...
> + goto cleanup;
> + }
> +
> + if (vm->def->onCrash == VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY) {
Worth doing this as 'else if'?
> + isReboot = false;
> + VIR_INFO("Domain on_crash setting overridden, shutting down");
That sounds like fake reboot is overriding on_crash settings. I'd word
this:
on_crash overrides fake reboot request, shutting down instead
and maybe be careful to only output that info message only if isReboot
actually changed from true to false.
> +
> + if (! virDomainObjIsActive(vm)) {
Generally no space after '!'.
> @@ -2673,6 +2770,10 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm)
> newState = VIR_DOMAIN_SHUTDOWN;
> newReason = VIR_DOMAIN_SHUTDOWN_UNKNOWN;
> ignore_value(VIR_STRDUP_QUIET(msg, "shutdown"));
> + } else if (reason == VIR_DOMAIN_PAUSED_GUEST_PANICKED) {
> + newState = VIR_DOMAIN_CRASHED;
> + newReason = VIR_DOMAIN_CRASHED_PANICKED;
> + ignore_value(VIR_STRDUP_QUIET(msg, "was crashed"));
s/was //
Overall, the mechanics seem like they will work, but the spelling to use
Guest instead of GUEST in function names probably warrants a respin.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130605/4b0ba2a6/attachment-0001.sig>
More information about the libvir-list
mailing list