[libvirt] [PATCH 3/6] test: Use privateData to track running VM vcpu state

Cole Robinson crobinso at redhat.com
Mon Nov 2 20:02:44 UTC 2009


Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/test/test_driver.c |  135 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 133 insertions(+), 2 deletions(-)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 8472e27..a8bec58 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -53,6 +53,15 @@
 
 #define VIR_FROM_THIS VIR_FROM_TEST
 
+/* Driver specific info to carry with a domain */
+struct _testDomainObjPrivate {
+    virVcpuInfoPtr vcpu_infos;
+
+    unsigned char *cpumaps;
+};
+typedef struct _testDomainObjPrivate testDomainObjPrivate;
+typedef struct _testDomainObjPrivate *testDomainObjPrivatePtr;
+
 #define MAX_CPUS 128
 
 struct _testCell {
@@ -126,6 +135,24 @@ static void testDriverUnlock(testConnPtr driver)
     virMutexUnlock(&driver->lock);
 }
 
+static void *testDomainObjPrivateAlloc(void)
+{
+    testDomainObjPrivatePtr priv;
+
+    if (VIR_ALLOC(priv) < 0)
+        return NULL;
+
+    return priv;
+}
+
+static void testDomainObjPrivateFree(void *data)
+{
+    testDomainObjPrivatePtr priv = data;
+
+    VIR_FREE(priv);
+}
+
+
 static virCapsPtr
 testBuildCapabilities(virConnectPtr conn) {
     testConnPtr privconn = conn->privateData;
@@ -173,6 +200,9 @@ testBuildCapabilities(virConnectPtr conn) {
             goto no_memory;
     }
 
+    caps->privateDataAllocFunc = testDomainObjPrivateAlloc;
+    caps->privateDataFreeFunc = testDomainObjPrivateFree;
+
     return caps;
 
 no_memory:
@@ -269,7 +299,9 @@ static const char *defaultNodeXML =
 static const unsigned long long defaultPoolCap = (100 * 1024 * 1024 * 1024ull);
 static const unsigned long long defaultPoolAlloc = 0;
 
-static int testStoragePoolObjSetDefaults(virConnectPtr conn, virStoragePoolObjPtr pool);
+static int testStoragePoolObjSetDefaults(virConnectPtr conn,
+                                         virStoragePoolObjPtr pool);
+static int testNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
 
 static char *
 testDomainGenerateIfname(virConnectPtr conn,
@@ -325,16 +357,115 @@ testDomainGenerateIfnames(virConnectPtr conn,
     return 0;
 }
 
+/* Helper to update info for a single VCPU */
+static int
+testDomainUpdateVCPU(virConnectPtr conn ATTRIBUTE_UNUSED,
+                     virDomainObjPtr dom,
+                     int vcpu,
+                     int maplen,
+                     int maxcpu)
+{
+    testDomainObjPrivatePtr privdata = dom->privateData;
+    virVcpuInfoPtr info = &privdata->vcpu_infos[vcpu];
+    unsigned char *cpumap = VIR_GET_CPUMAP(privdata->cpumaps, maplen, vcpu);
+    int j;
+
+    memset(info, 0, sizeof(virVcpuInfo));
+    memset(cpumap, 0, maplen);
+
+    info->number    = vcpu;
+    info->state     = VIR_VCPU_RUNNING;
+    info->cpuTime   = 5000000;
+    info->cpu       = 0;
+
+    if (dom->def->cpumask) {
+        for (j = 0; j < maxcpu && j < VIR_DOMAIN_CPUMASK_LEN; ++j) {
+            if (dom->def->cpumask[j]) {
+                VIR_USE_CPU(cpumap, j);
+                info->cpu = j;
+            }
+        }
+    } else {
+        for (j = 0; j < maxcpu; ++j) {
+            if ((j % 3) == 0) {
+                /* Mark of every third CPU as usable */
+                VIR_USE_CPU(cpumap, j);
+                info->cpu = j;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/*
+ * Update domain VCPU amount and info
+ *
+ * @conn: virConnectPtr
+ * @dom : domain needing updates
+ * @nvcpus: New amount of vcpus for the domain
+ * @clear_all: If true, rebuild info for ALL vcpus, not just newly added vcpus
+ */
+static int
+testDomainUpdateVCPUs(virConnectPtr conn,
+                      virDomainObjPtr dom,
+                      int nvcpus,
+                      unsigned int clear_all)
+{
+    testConnPtr privconn = conn->privateData;
+    testDomainObjPrivatePtr privdata = dom->privateData;
+    int i, ret = -1;
+    int cpumaplen, maxcpu;
+
+    maxcpu  = VIR_NODEINFO_MAXCPUS(privconn->nodeInfo);
+    cpumaplen = VIR_CPU_MAPLEN(maxcpu);
+
+    if (VIR_REALLOC_N(privdata->vcpu_infos, nvcpus) < 0) {
+        virReportOOMError(conn);
+        goto cleanup;
+    }
+
+    if (VIR_REALLOC_N(privdata->cpumaps, nvcpus * cpumaplen) < 0) {
+        virReportOOMError(conn);
+        goto cleanup;
+    }
+
+    /* Set running VCPU and cpumap state */
+    if (clear_all) {
+        for (i = 0; i < nvcpus; ++i)
+            if (testDomainUpdateVCPU(conn, dom, i, cpumaplen, maxcpu) < 0)
+                goto cleanup;
+
+    } else if (nvcpus > dom->def->vcpus) {
+        /* VCPU amount has grown, populate info for the new vcpus */
+        for (i = dom->def->vcpus; i < nvcpus; ++i)
+            if (testDomainUpdateVCPU(conn, dom, i, cpumaplen, maxcpu) < 0)
+                goto cleanup;
+    }
+
+    ret = 0;
+cleanup:
+    return ret;
+}
+
+/* Set up domain runtime state */
 static int
 testDomainStartState(virConnectPtr conn,
                      virDomainObjPtr dom)
 {
     testConnPtr privconn = conn->privateData;
+    int ret = -1;
+
+    if (testDomainUpdateVCPUs(conn, dom, dom->def->vcpus, 1) < 0)
+        goto cleanup;
 
+    /* Set typical run state */
     dom->state = VIR_DOMAIN_RUNNING;
     dom->def->id = privconn->nextDomID++;
 
-    return 0;
+    ret = 0;
+cleanup:
+    return ret;
 }
 
 static int testOpenDefault(virConnectPtr conn) {
-- 
1.6.5.1




More information about the libvir-list mailing list