[libvirt] [PATCH] Save vcpuinfo in status file

Daniel P. Berrange berrange at redhat.com
Fri Sep 11 15:27:48 UTC 2009


* src/qemu_driver.c: Don't trust monitor for vcpu PID info on
  restart
* src/domain_conf.c: Save and load vCPU PID info from domain
  status file
---
 src/domain_conf.c |   35 +++++++++++++++++++++++++++++++++++
 src/qemu_driver.c |    5 +----
 2 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/domain_conf.c b/src/domain_conf.c
index 050cf50..5ae0775 100644
--- a/src/domain_conf.c
+++ b/src/domain_conf.c
@@ -3061,6 +3061,8 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
     xmlNodePtr oldnode;
     virDomainObjPtr obj;
     char *monitorpath;
+    xmlNodePtr *nodes = NULL;
+    int n, i;
 
     if (!(obj = virDomainObjNew(conn)))
         return NULL;
@@ -3133,9 +3135,32 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
         break;
     }
 
+    n = virXPathNodeSet(conn, "./vcpus/vcpu", ctxt, &nodes);
+    if (n < 0)
+        goto error;
+    if (n) {
+        obj->nvcpupids = n;
+        if (VIR_REALLOC_N(obj->vcpupids, obj->nvcpupids) < 0)
+            goto error;
+
+        for (i = 0 ; i < n ; i++) {
+            char *pidstr = virXMLPropString(nodes[i], "pid");
+            if (!pidstr)
+                goto error;
+
+            if (virStrToLong_i(pidstr, NULL, 10, &(obj->vcpupids[i])) < 0) {
+                VIR_FREE(pidstr);
+                goto error;
+            }
+            VIR_FREE(pidstr);
+        }
+        VIR_FREE(nodes);
+    }
+
     return obj;
 
 error:
+    VIR_FREE(nodes);
     virDomainChrDefFree(obj->monitor_chr);
     virDomainObjFree(obj);
     return NULL;
@@ -4422,6 +4447,16 @@ char *virDomainObjFormat(virConnectPtr conn,
     virBufferVSprintf(&buf, " type='%s'/>\n",
                       virDomainChrTypeToString(obj->monitor_chr->type));
 
+
+    if (obj->nvcpupids) {
+        int i;
+        virBufferAddLit(&buf, "  <vcpus>\n");
+        for (i = 0 ; i < obj->nvcpupids ; i++) {
+            virBufferVSprintf(&buf, "    <vcpu pid='%d'/>\n", obj->vcpupids[i]);
+        }
+        virBufferAddLit(&buf, "  </vcpus>\n");
+    }
+
     if (!(config_xml = virDomainDefFormat(conn,
                                           obj->def,
                                           flags)))
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 0e7d8d4..a65334f 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -336,10 +336,6 @@ qemuReconnectDomain(struct qemud_driver *driver,
         goto error;
     }
 
-    if (qemudDetectVcpuPIDs(NULL, obj) < 0) {
-        goto error;
-    }
-
     if (qemuUpdateActivePciHostdevs(driver, obj->def) < 0) {
         goto error;
     }
@@ -2519,6 +2515,7 @@ qemudMonitorCommandWithHandler(const virDomainObjPtr vm,
 
     qemuMonitorDiscardPendingData(vm);
 
+    VIR_DEBUG("Send '%s'", cmd);
     if (qemudMonitorSend(vm, cmd, scm_fd) < 0)
         return -1;
 
-- 
1.6.2.5




More information about the libvir-list mailing list