[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] PATCH: Fix startup of LXC vms without cgroups



If cgroups was not mounted at all, LXC would fail to start any VM, since
we missed an error code check

Daniel

commit 8713c7e8111e73879f8380b920995ff3d1f3f9e9
Author: Daniel P. Berrange <berrange redhat com>
Date:   Fri Jul 31 14:37:25 2009 +0100

    Don't try to activate cgroups if not present for LXC
    
    * src/lxc_controller.c: Don't throw error in LXC startup if
      the cgroups driver mount isn't available. Improve error
      logging for resource setup

diff --git a/src/lxc_controller.c b/src/lxc_controller.c
index 9ad48a7..8d11238 100644
--- a/src/lxc_controller.c
+++ b/src/lxc_controller.c
@@ -84,25 +84,38 @@ static int lxcSetContainerResources(virDomainDefPtr def)
 
     rc = virCgroupForDriver("lxc", &driver, 1, 0);
     if (rc != 0) {
-        lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
-                 _("Unable to get cgroup for driver"));
+        /* Skip all if no driver cgroup is configured */
+        if (rc == -ENXIO || rc == -ENOENT)
+            return 0;
+
+        virReportSystemError(NULL, -rc, "%s",
+                             _("Unable to get cgroup for driver"));
         return rc;
     }
 
     rc = virCgroupForDomain(driver, def->name, &cgroup, 1);
     if (rc != 0) {
-        lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                 _("Unable to create cgroup for domain %s"), def->name);
+        virReportSystemError(NULL, -rc,
+                             _("Unable to create cgroup for domain %s"),
+                             def->name);
         goto cleanup;
     }
 
     rc = virCgroupSetMemory(cgroup, def->maxmem);
-    if (rc != 0)
-        goto out;
+    if (rc != 0) {
+        virReportSystemError(NULL, -rc,
+                             _("Unable to set memory limit for domain %s"),
+                             def->name);
+        goto cleanup;
+    }
 
     rc = virCgroupDenyAllDevices(cgroup);
-    if (rc != 0)
-        goto out;
+    if (rc != 0) {
+        virReportSystemError(NULL, -rc,
+                             _("Unable to deny devices for domain %s"),
+                             def->name);
+        goto cleanup;
+    }
 
     for (i = 0; devices[i].type != 0; i++) {
         struct cgroup_device_policy *dev = &devices[i];
@@ -110,19 +123,27 @@ static int lxcSetContainerResources(virDomainDefPtr def)
                                   dev->type,
                                   dev->major,
                                   dev->minor);
-        if (rc != 0)
-            goto out;
+        if (rc != 0) {
+            virReportSystemError(NULL, -rc,
+                                 _("Unable to allow device %c:%d:%d for domain %s"),
+                                 dev->type, dev->major, dev->minor, def->name);
+            goto cleanup;
+        }
     }
 
     rc = virCgroupAllowDeviceMajor(cgroup, 'c', LXC_DEV_MAJ_PTY);
-    if (rc != 0)
-        goto out;
+    if (rc != 0) {
+        virReportSystemError(NULL, -rc,
+                             _("Unable to allow PYT devices for domain %s"),
+                             def->name);
+        goto cleanup;
+    }
 
     rc = virCgroupAddTask(cgroup, getpid());
-out:
     if (rc != 0) {
-        virReportSystemError(NULL, -rc, "%s",
-                             _("Failed to set lxc resources"));
+        virReportSystemError(NULL, -rc,
+                             _("Unable to add task %d to cgroup for domain %s"),
+                             getpid(), def->name);
     }
 
 cleanup:


-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]