mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 07:17:44 +00:00
libxl: add support for soft reset
The pvops Linux kernel implements machine_ops.crash_shutdown as static void xen_hvm_crash_shutdown(struct pt_regs *regs) { native_machine_crash_shutdown(regs); xen_reboot(SHUTDOWN_soft_reset); } but currently the libxl driver does not handle the soft reset shutdown event. As a result, the guest domain never proceeds past xen_reboot(), making it impossible for HVM domains to save a crash dump using kexec. This patch adds support for handling the soft reset event by calling libxl_domain_soft_reset() and re-enabling domain death events, which is similar to the xl tool handling of soft reset shutdown event. Signed-off-by: Jim Fehlig <jfehlig@suse.com> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
82452a5d7f
commit
da4b0fd9d3
@ -471,8 +471,10 @@ libxlDomainShutdownThread(void *opaque)
|
|||||||
virObjectEventPtr dom_event = NULL;
|
virObjectEventPtr dom_event = NULL;
|
||||||
libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason;
|
libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason;
|
||||||
libxlDriverConfigPtr cfg;
|
libxlDriverConfigPtr cfg;
|
||||||
|
libxl_domain_config d_config;
|
||||||
|
|
||||||
cfg = libxlDriverConfigGet(driver);
|
cfg = libxlDriverConfigGet(driver);
|
||||||
|
libxl_domain_config_init(&d_config);
|
||||||
|
|
||||||
vm = virDomainObjListFindByID(driver->domains, ev->domid);
|
vm = virDomainObjListFindByID(driver->domains, ev->domid);
|
||||||
if (!vm) {
|
if (!vm) {
|
||||||
@ -563,6 +565,34 @@ libxlDomainShutdownThread(void *opaque)
|
|||||||
* Similar to the xl implementation, ignore SUSPEND. Any actions needed
|
* Similar to the xl implementation, ignore SUSPEND. Any actions needed
|
||||||
* after calling libxl_domain_suspend() are handled by it's callers.
|
* after calling libxl_domain_suspend() are handled by it's callers.
|
||||||
*/
|
*/
|
||||||
|
#ifdef LIBXL_HAVE_SOFT_RESET
|
||||||
|
} else if (xl_reason == LIBXL_SHUTDOWN_REASON_SOFT_RESET) {
|
||||||
|
libxlDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
|
||||||
|
if (libxl_retrieve_domain_configuration(cfg->ctx, vm->def->id,
|
||||||
|
&d_config) != 0) {
|
||||||
|
VIR_ERROR(_("Failed to retrieve config for VM '%s'. "
|
||||||
|
"Unable to perform soft reset. Destroying VM"),
|
||||||
|
vm->def->name);
|
||||||
|
libxlDomainShutdownHandleDestroy(driver, vm);
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priv->deathW) {
|
||||||
|
libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
|
||||||
|
priv->deathW = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (libxl_domain_soft_reset(cfg->ctx, &d_config, vm->def->id,
|
||||||
|
NULL, NULL) != 0) {
|
||||||
|
VIR_ERROR(_("Failed to soft reset VM '%s'. Destroying VM"),
|
||||||
|
vm->def->name);
|
||||||
|
libxlDomainShutdownHandleDestroy(driver, vm);
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW);
|
||||||
|
libxl_domain_unpause(cfg->ctx, vm->def->id);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
VIR_INFO("Unhandled shutdown_reason %d", xl_reason);
|
VIR_INFO("Unhandled shutdown_reason %d", xl_reason);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user