In certain cases hypervisors on encountering an internal fault pause the
domain to allow gathering useful debugging information. Libvirt for now
would report 'VIR_DOMAIN_PAUSED_UNKNOWN' which isn't entirely helpful.
Add a new paused reason and the corresponding value for the suspended
event, so that hypervisor drivers can report this state properly.
In qemu this will be mapped to the 'internal-error' paused reason.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
examples/c/misc/event-test.c | 3 +++
include/libvirt/libvirt-domain.h | 2 ++
src/conf/domain_conf.c | 1 +
src/qemu/qemu_domain.c | 3 +++
src/qemu/qemu_monitor.c | 4 +++-
tools/virsh-domain-monitor.c | 1 +
tools/virsh-domain.c | 3 ++-
7 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/examples/c/misc/event-test.c b/examples/c/misc/event-test.c
index 76d4f3f6e8..c7d60d4c61 100644
--- a/examples/c/misc/event-test.c
+++ b/examples/c/misc/event-test.c
@@ -187,6 +187,9 @@ eventDetailToString(int event,
case VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY_FAILED:
return "Post-copy Error";
+ case VIR_DOMAIN_EVENT_SUSPENDED_HYPERVISOR_FAULT:
+ return "Hypervisor fault";
+
case VIR_DOMAIN_EVENT_SUSPENDED_LAST:
break;
}
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 03c119fe26..f1c0e960f9 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -119,6 +119,7 @@ typedef enum {
VIR_DOMAIN_PAUSED_STARTING_UP = 11, /* the domain is being started */
VIR_DOMAIN_PAUSED_POSTCOPY = 12, /* paused for post-copy migration */
VIR_DOMAIN_PAUSED_POSTCOPY_FAILED = 13, /* paused after failed post-copy */
+ VIR_DOMAIN_PAUSED_HYPERVISOR_FAULT = 14, /* paused after a hypervisor failure */
# ifdef VIR_ENUM_SENTINELS
VIR_DOMAIN_PAUSED_LAST
@@ -3108,6 +3109,7 @@ typedef enum {
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR = 6, /* suspended after failure during libvirt
API call */
VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY = 7, /* suspended for post-copy migration */
VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY_FAILED = 8, /* suspended after failed post-copy
*/
+ VIR_DOMAIN_EVENT_SUSPENDED_HYPERVISOR_FAULT = 9, /* suspended after a hypervisor
fault */
# ifdef VIR_ENUM_SENTINELS
VIR_DOMAIN_EVENT_SUSPENDED_LAST
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 47756ff0be..f49db930ca 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1082,6 +1082,7 @@ VIR_ENUM_IMPL(virDomainPausedReason,
"starting up",
"post-copy",
"post-copy failed",
+ "hypervisor fault",
);
VIR_ENUM_IMPL(virDomainShutdownReason,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index ed2a1481d4..dde9ba92c6 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -11180,6 +11180,9 @@ qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason
reason)
case VIR_DOMAIN_PAUSED_POSTCOPY:
return VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY;
+ case VIR_DOMAIN_PAUSED_HYPERVISOR_FAULT:
+ return VIR_DOMAIN_EVENT_SUSPENDED_HYPERVISOR_FAULT;
+
case VIR_DOMAIN_PAUSED_UNKNOWN:
case VIR_DOMAIN_PAUSED_USER:
case VIR_DOMAIN_PAUSED_SAVE:
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index c43c6f180e..ca6bd79516 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3508,10 +3508,12 @@ qemuMonitorVMStatusToPausedReason(const char *status)
switch ((qemuMonitorVMStatus) st) {
case QEMU_MONITOR_VM_STATUS_DEBUG:
- case QEMU_MONITOR_VM_STATUS_INTERNAL_ERROR:
case QEMU_MONITOR_VM_STATUS_RESTORE_VM:
return VIR_DOMAIN_PAUSED_UNKNOWN;
+ case QEMU_MONITOR_VM_STATUS_INTERNAL_ERROR:
+ return VIR_DOMAIN_PAUSED_HYPERVISOR_FAULT;
+
case QEMU_MONITOR_VM_STATUS_INMIGRATE:
case QEMU_MONITOR_VM_STATUS_POSTMIGRATE:
case QEMU_MONITOR_VM_STATUS_FINISH_MIGRATE:
diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index c4d7464695..169fd5931b 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -195,6 +195,7 @@ VIR_ENUM_IMPL(virshDomainPausedReason,
N_("starting up"),
N_("post-copy"),
N_("post-copy failed"),
+ N_("hypervisor fault"),
);
VIR_ENUM_DECL(virshDomainShutdownReason);
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 7db88f700a..05b75edcda 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -12837,7 +12837,8 @@ VIR_ENUM_IMPL(virshDomainEventSuspended,
N_("Snapshot"),
N_("API error"),
N_("Post-copy"),
- N_("Post-copy Error"));
+ N_("Post-copy Error"),
+ N_("Hypervisor fault"));
VIR_ENUM_DECL(virshDomainEventResumed);
VIR_ENUM_IMPL(virshDomainEventResumed,
--
2.29.2