]> xenbits.xensource.com Git - libvirt.git/commitdiff
Introduce virDomainEmulatorPinAdd and virDomainEmulatorPinDel functions
authorTang Chen <tangchen@cn.fujitsu.com>
Tue, 21 Aug 2012 09:18:36 +0000 (17:18 +0800)
committerDaniel Veillard <veillard@redhat.com>
Wed, 22 Aug 2012 08:29:57 +0000 (16:29 +0800)
Introduce 2 APIs to support emulator threads pin.
    1) virDomainEmulatorPinAdd: setup emulator threads pin with a given cpumap string.
    2) virDomainEmulatorPinDel: remove all emulator threads pin.

Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index 304ab88e78bba564a52b47d2c53c18515c0d01a7..9e97301374c323781bf898570e2bdd6c50a93383 100644 (file)
@@ -11124,6 +11124,77 @@ virDomainVcpuPinDel(virDomainDefPtr def, int vcpu)
     return 0;
 }
 
+int
+virDomainEmulatorPinAdd(virDomainDefPtr def,
+                        unsigned char *cpumap,
+                        int maplen)
+{
+    virDomainVcpuPinDefPtr emulatorpin = NULL;
+    char *cpumask = NULL;
+    int i;
+
+    if (VIR_ALLOC_N(cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    /* Convert bitmap (cpumap) to cpumask, which is byte map. */
+    for (i = 0; i < maplen; i++) {
+        int cur;
+
+        for (cur = 0; cur < 8; cur++) {
+            if (cpumap[i] & (1 << cur))
+                cpumask[i * 8 + cur] = 1;
+        }
+    }
+
+    if (!def->cputune.emulatorpin) {
+        /* No emulatorpin exists yet. */
+        if (VIR_ALLOC(emulatorpin) < 0) {
+            virReportOOMError();
+            goto cleanup;
+        }
+
+        emulatorpin->vcpuid = -1;
+        emulatorpin->cpumask = cpumask;
+        def->cputune.emulatorpin = emulatorpin;
+    } else {
+        /* Since there is only 1 emulatorpin for each vm,
+         * juest replace the old one.
+         */
+        VIR_FREE(def->cputune.emulatorpin->cpumask);
+        def->cputune.emulatorpin->cpumask = cpumask;
+    }
+
+    return 0;
+
+cleanup:
+    VIR_FREE(cpumask);
+    return -1;
+}
+
+int
+virDomainEmulatorPinDel(virDomainDefPtr def)
+{
+    virDomainVcpuPinDefPtr emulatorpin = NULL;
+
+    /* No emulatorpin exists yet */
+    if (!def->cputune.emulatorpin) {
+        return 0;
+    }
+
+    emulatorpin = def->cputune.emulatorpin;
+
+    VIR_FREE(emulatorpin->cpumask);
+    VIR_FREE(emulatorpin);
+    def->cputune.emulatorpin = NULL;
+
+    if (def->cputune.emulatorpin)
+        return -1;
+
+    return 0;
+}
+
 static int
 virDomainLifecycleDefFormat(virBufferPtr buf,
                             int type,
index 8cd685e4c34d42fcd91c643670f7ea7b95aeb53b..5a02323ea776a03285bcc5169e3d97008a118b8c 100644 (file)
@@ -1998,6 +1998,12 @@ int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
 
 int virDomainVcpuPinDel(virDomainDefPtr def, int vcpu);
 
+int virDomainEmulatorPinAdd(virDomainDefPtr def,
+                              unsigned char *cpumap,
+                              int maplen);
+
+int virDomainEmulatorPinDel(virDomainDefPtr def);
+
 int virDomainDiskIndexByName(virDomainDefPtr def, const char *name,
                              bool allow_ambiguous);
 const char *virDomainDiskPathByName(virDomainDefPtr, const char *name);
index 6b9eded51c70951601fd22e5f98e021fa272ec48..8962de2ed9a7b1d6cb5b1d13f464a7da51ce9f35 100644 (file)
@@ -345,6 +345,8 @@ virDomainDiskSnapshotTypeFromString;
 virDomainDiskSnapshotTypeToString;
 virDomainDiskTypeFromString;
 virDomainDiskTypeToString;
+virDomainEmulatorPinAdd;
+virDomainEmulatorPinDel;
 virDomainFSDefFree;
 virDomainFSIndexByName;
 virDomainFSTypeFromString;