[libvirt] [PATCH 9/9] qemu: Update domain status to running while wakeup event is emitted

Osier Yang jyang at redhat.com
Mon Mar 5 10:25:47 UTC 2012


This introduces a new running reason VIR_DOMAIN_RUNNING_WAKEUP,
and new suspend event type VIR_DOMAIN_EVENT_STARTED_WAKEUP.

While a wakeup event is emitted, the domain which was paused with
reason VIR_DOMAIN_PAUSED_SUSPEND will be transferred to "running"
with reason VIR_DOMAIN_RUNNING_WAKEUP, and a new domain lifecycle
event emitted with type VIR_DOMAIN_EVENT_STARTED_WAKEUP.
---
 examples/domain-events/events-c/event-test.c |    3 ++
 include/libvirt/libvirt.h.in                 |    2 +
 src/qemu/qemu_process.c                      |   30 ++++++++++++++++++++++++-
 tools/virsh.c                                |    2 +
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c
index 9231604..79a89b0 100644
--- a/examples/domain-events/events-c/event-test.c
+++ b/examples/domain-events/events-c/event-test.c
@@ -93,6 +93,9 @@ static const char *eventDetailToString(int event, int detail) {
             case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT:
                 ret = "Snapshot";
                 break;
+            case VIR_DOMAIN_EVENT_STARTED_WAKEUP:
+                ret = "Event wakeup";
+                break;
             }
             break;
         case VIR_DOMAIN_EVENT_SUSPENDED:
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 11b7388..7c8c820 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -121,6 +121,7 @@ typedef enum {
     VIR_DOMAIN_RUNNING_UNPAUSED = 5,        /* returned from paused state */
     VIR_DOMAIN_RUNNING_MIGRATION_CANCELED = 6,  /* returned from migration */
     VIR_DOMAIN_RUNNING_SAVE_CANCELED = 7,   /* returned from failed save process */
+    VIR_DOMAIN_RUNNING_WAKEUP = 8,          /* returned due to a wakeup event */
 
 #ifdef VIR_ENUM_SENTINELS
     VIR_DOMAIN_RUNNING_LAST
@@ -2665,6 +2666,7 @@ typedef enum {
     VIR_DOMAIN_EVENT_STARTED_MIGRATED = 1, /* Incoming migration from another host */
     VIR_DOMAIN_EVENT_STARTED_RESTORED = 2, /* Restored from a state file */
     VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT = 3, /* Restored from snapshot */
+    VIR_DOMAIN_EVENT_STARTED_WAKEUP = 4,   /* Started due to a wakeup event */
 
 #ifdef VIR_ENUM_SENTINELS
     VIR_DOMAIN_EVENT_STARTED_LAST
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 19e6e03..c75067d 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1064,15 +1064,41 @@ qemuProcessHandleWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
 {
     struct qemud_driver *driver = qemu_driver;
     virDomainEventPtr event = NULL;
+    virDomainEventPtr lifecycleEvent = NULL;
+    int reason;
+
 
     virDomainObjLock(vm);
     event = virDomainEventWakeupNewFromObj(vm);
 
     virDomainObjUnlock(vm);
 
-    if (event) {
+    /* Don't set domain status back to running if it wasn't paused
+     * from guest side, otherwise it can just cause confusion.
+     */
+    if ((virDomainObjGetState(vm, &reason) == VIR_DOMAIN_PAUSED) &&
+        (reason == VIR_DOMAIN_PAUSED_SUSPEND)) {
+        VIR_DEBUG("Transitioned guest %s to running state due to "
+                  "QMP wakeup event", vm->def->name);
+
+        virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
+                             VIR_DOMAIN_RUNNING_WAKEUP);
+        lifecycleEvent = virDomainEventNewFromObj(vm,
+                                                  VIR_DOMAIN_EVENT_STARTED,
+                                                  VIR_DOMAIN_EVENT_STARTED_WAKEUP);
+
+        if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) {
+            VIR_WARN("Unable to save status on vm %s after wakeup event",
+                     vm->def->name);
+        }
+    }
+
+    if (event || lifecycleEvent) {
         qemuDriverLock(driver);
-        qemuDomainEventQueue(driver, event);
+        if (event)
+            qemuDomainEventQueue(driver, event);
+        if (lifecycleEvent)
+            qemuDomainEventQueue(driver, lifecycleEvent);
         qemuDriverUnlock(driver);
     }
 
diff --git a/tools/virsh.c b/tools/virsh.c
index 9063131..09e3290 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -18596,6 +18596,8 @@ vshDomainStateReasonToString(int state, int reason)
             return N_("migration canceled");
         case VIR_DOMAIN_RUNNING_SAVE_CANCELED:
             return N_("save canceled");
+        case VIR_DOMAIN_RUNNING_WAKEUP:
+            return N_("event wakeup");
         case VIR_DOMAIN_RUNNING_UNKNOWN:
         case VIR_DOMAIN_RUNNING_LAST:
             ;
-- 
1.7.1




More information about the libvir-list mailing list