]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Add support for setting vCPU and I/O thread scheduler setting
authorMartin Kletzander <mkletzan@redhat.com>
Thu, 8 Jan 2015 14:37:50 +0000 (15:37 +0100)
committerMartin Kletzander <mkletzan@redhat.com>
Wed, 11 Feb 2015 16:30:07 +0000 (17:30 +0100)
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1178986

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_process.c
src/qemu/qemu_process.h

index 26fc6a2a0c9af12632bb46370dc2cfee665701bc..274278c014fb29111bec720137c3195826d11373 100644 (file)
@@ -4620,6 +4620,11 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
             }
 
             virCgroupFree(&cgroup_vcpu);
+
+            if (qemuProcessSetSchedParams(i, cpupids[i],
+                                          vm->def->cputune.nvcpusched,
+                                          vm->def->cputune.vcpusched) < 0)
+                goto cleanup;
         }
     } else {
         for (i = oldvcpus - 1; i >= nvcpus; i--) {
index d5df60dfc20404e048b688642b52704ba82d195c..4773120f51067cd1c9e1ba27c1aa795208d8622d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * qemu_process.c: QEMU process management
  *
- * Copyright (C) 2006-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2015 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -2574,6 +2574,57 @@ qemuProcessSetIOThreadsAffinity(virDomainObjPtr vm)
     return ret;
 }
 
+/* Set Scheduler parameters for vCPU or I/O threads. */
+int
+qemuProcessSetSchedParams(int id,
+                          pid_t pid,
+                          size_t nsp,
+                          virDomainThreadSchedParamPtr sp)
+{
+    bool val = false;
+    size_t i = 0;
+    virDomainThreadSchedParamPtr s = NULL;
+
+    for (i = 0; i < nsp; i++) {
+        if (virBitmapGetBit(sp[i].ids, id, &val) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Cannot get bit from bitmap"));
+        }
+        if (val) {
+            s = &sp[i];
+            break;
+        }
+    }
+
+    if (!s)
+        return 0;
+
+    return virProcessSetScheduler(pid, s->scheduler, s->priority);
+}
+
+static int
+qemuProcessSetSchedulers(virDomainObjPtr vm)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    size_t i = 0;
+
+    for (i = 0; i < priv->nvcpupids; i++) {
+        if (qemuProcessSetSchedParams(i, priv->vcpupids[i],
+                                      vm->def->cputune.nvcpusched,
+                                      vm->def->cputune.vcpusched) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < priv->niothreadpids; i++) {
+        if (qemuProcessSetSchedParams(i + 1, priv->iothreadpids[i],
+                                      vm->def->cputune.niothreadsched,
+                                      vm->def->cputune.iothreadsched) < 0)
+            return -1;
+    }
+
+    return 0;
+}
+
 static int
 qemuProcessInitPasswords(virConnectPtr conn,
                          virQEMUDriverPtr driver,
@@ -4869,6 +4920,10 @@ int qemuProcessStart(virConnectPtr conn,
     if (qemuProcessSetIOThreadsAffinity(vm) < 0)
         goto cleanup;
 
+    VIR_DEBUG("Setting scheduler parameters");
+    if (qemuProcessSetSchedulers(vm) < 0)
+        goto cleanup;
+
     VIR_DEBUG("Setting any required VM passwords");
     if (qemuProcessInitPasswords(conn, driver, vm, asyncJob) < 0)
         goto cleanup;
index 5948ea4704c355a605adc60e6a8e430d3811b1f6..2e1d3932197a21e0415f4af8072b6d0812504f84 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * qemu_process.h: QEMU process management
  *
- * Copyright (C) 2006-2012 Red Hat, Inc.
+ * Copyright (C) 2006-2012, 2015 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -104,4 +104,7 @@ virBitmapPtr qemuPrepareCpumap(virQEMUDriverPtr driver,
 
 int qemuProcessReadLog(int fd, char *buf, int buflen, int off, bool skipchar);
 
+int qemuProcessSetSchedParams(int id, pid_t pid, size_t nsp,
+                              virDomainThreadSchedParamPtr sp);
+
 #endif /* __QEMU_PROCESS_H__ */