]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Disallow NUMA/network tuning for session mode
authorErik Skultety <eskultet@redhat.com>
Wed, 1 Oct 2014 12:57:32 +0000 (14:57 +0200)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 22 Oct 2014 18:35:06 +0000 (14:35 -0400)
Tuning NUMA or network interface parameters requires root
privileges to manage cgroups. Thus an attempt to set some of these
parameters in session mode on a running domain should be invalid
followed by an error. An example might be memory tuning which raises
an error in such case.

The following behavior in session mode will be present after applying
this patch:

  Tuning  |      SET      |   GET  |
----------|---------------|--------|
NUMA      | shut off only | always |
Memory    |     never     | never  |
Interface |     never     | always |

Resolves https://bugzilla.redhat.com/show_bug.cgi?id=1126762

src/qemu/qemu_command.c
src/qemu/qemu_driver.c

index 8cb0865d985f1169ed29ee5d97393f3c25d5d582..2e5af4f9419fbaa4454c7ad75c29d6ef55a4ac94 100644 (file)
@@ -7812,7 +7812,7 @@ qemuBuildCommandLine(virConnectPtr conn,
     emulator = def->emulator;
 
     if (!cfg->privileged) {
-        /* If we have no cgroups than we can have no tunings that
+        /* If we have no cgroups then we can have no tunings that
          * require them */
 
         if (def->mem.hard_limit || def->mem.soft_limit ||
@@ -7835,6 +7835,17 @@ qemuBuildCommandLine(virConnectPtr conn,
                            _("CPU tuning is not available in session mode"));
             goto error;
         }
+
+        virDomainNetDefPtr *nets = def->nets;
+        virNetDevBandwidthPtr bandwidth = NULL;
+        size_t nnets = def->nnets;
+        for (i = 0; i < nnets; i++) {
+            if ((bandwidth = virDomainNetGetActualBandwidth(nets[i])) != NULL) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                    _("Network bandwidth tuning is not available in session mode"));
+                goto error;
+            }
+        }
     }
 
     for (i = 0; i < def->ngraphics; ++i) {
index d1f960007b36116e1bfbb32c619a74e1fe3a5ab5..98e16adea3e50c009d1cac0a267c0cc404c49554 100644 (file)
@@ -9185,6 +9185,13 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
                                         &persistentDef) < 0)
         goto endjob;
 
+    if (!cfg->privileged &&
+        flags & VIR_DOMAIN_AFFECT_LIVE) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                       _("NUMA tuning is not available in session mode"));
+        goto cleanup;
+    }
+
     if (flags & VIR_DOMAIN_AFFECT_LIVE) {
         if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
             virReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -9276,6 +9283,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
     size_t i;
     virDomainObjPtr vm = NULL;
     virDomainDefPtr persistentDef = NULL;
+    virQEMUDriverConfigPtr cfg = NULL;
     char *nodeset = NULL;
     int ret = -1;
     virCapsPtr caps = NULL;
@@ -9294,6 +9302,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
         return -1;
 
     priv = vm->privateData;
+    cfg = virQEMUDriverGetConfig(driver);
 
     if (virDomainGetNumaParametersEnsureACL(dom->conn, vm->def) < 0)
         goto cleanup;
@@ -9311,14 +9320,6 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (flags & VIR_DOMAIN_AFFECT_LIVE) {
-        if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_MEMORY)) {
-            virReportError(VIR_ERR_OPERATION_INVALID,
-                           "%s", _("cgroup memory controller is not mounted"));
-            goto cleanup;
-        }
-    }
-
     for (i = 0; i < QEMU_NB_NUMA_PARAM && i < *nparams; i++) {
         virMemoryParameterPtr param = &params[i];
 
@@ -9341,9 +9342,16 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
                 if (!nodeset)
                     goto cleanup;
             } else {
-                if (virCgroupGetCpusetMems(priv->cgroup, &nodeset) < 0)
-                    goto cleanup;
+                if (!virCgroupHasController(priv->cgroup,
+                                            VIR_CGROUP_CONTROLLER_MEMORY) ||
+                    virCgroupGetCpusetMems(priv->cgroup, &nodeset) < 0) {
+                    nodeset = virDomainNumatuneFormatNodeset(vm->def->numatune,
+                                                             NULL, -1);
+                    if (!nodeset)
+                        goto cleanup;
+                }
             }
+
             if (virTypedParameterAssign(param, VIR_DOMAIN_NUMA_NODESET,
                                         VIR_TYPED_PARAM_STRING, nodeset) < 0)
                 goto cleanup;
@@ -9368,6 +9376,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
     if (vm)
         virObjectUnlock(vm);
     virObjectUnref(caps);
+    virObjectUnref(cfg);
     return ret;
 }
 
@@ -10338,6 +10347,12 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
     if (virDomainSetInterfaceParametersEnsureACL(dom->conn, vm->def, flags) < 0)
         goto cleanup;
 
+    if (!cfg->privileged) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                       _("Network bandwidth tuning is not available in session mode"));
+        goto cleanup;
+    }
+
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         goto cleanup;