]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_driver: add virCgroupMounted
authorLai Jiangshan <laijs@cn.fujitsu.com>
Fri, 29 Oct 2010 09:32:16 +0000 (17:32 +0800)
committerEric Blake <eblake@redhat.com>
Fri, 29 Oct 2010 15:46:25 +0000 (09:46 -0600)
When we mount any cgroup without "-o devices", we will fail to start vms:

error: Failed to start domain vm1
error: Unable to deny all devices for vm1: No such file or directory

When we mount any cgroup without "-o cpu", we will fail to get schedinfo:
Scheduler      : posix
error: unable to get cpu shares tunable: No such file or directory

We should only use the cgroup controllers which are mounted on host.
So I add virCgroupMounted() for qemuCgroupControllerActive()

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
src/libvirt_private.syms
src/qemu/qemu_driver.c
src/util/cgroup.c
src/util/cgroup.h

index cf06256ccdf98df155b34f38fe2b69299cc2bc21..cf64bd3661254e1ce6629cb872dfb94f06452f62 100644 (file)
@@ -72,6 +72,7 @@ virCgroupGetMemoryHardLimit;
 virCgroupGetMemorySoftLimit;
 virCgroupGetMemoryUsage;
 virCgroupGetSwapHardLimit;
+virCgroupMounted;
 virCgroupRemove;
 virCgroupSetCpuShares;
 virCgroupSetFreezerState;
index 1eea3a989f0090a6068ac8c1b00255ffda8bbce0..554bf8628149a676ec957f9fb3191a1c4e33e822 100644 (file)
@@ -730,6 +730,8 @@ static int qemuCgroupControllerActive(struct qemud_driver *driver,
 {
     if (driver->cgroup == NULL)
         return 0;
+    if (!virCgroupMounted(driver->cgroup, controller))
+        return 0;
     if (driver->cgroupControllers & (1 << controller))
         return 1;
     return 0;
index 7e887dc55c937bc0c7aaba67bd302e171a47e197..3779f76241b5f541f7a2b005f8ae4457f51dec48 100644 (file)
@@ -71,6 +71,19 @@ void virCgroupFree(virCgroupPtr *group)
     VIR_FREE(*group);
 }
 
+/**
+ * virCgroupMounted: query whether a cgroup subsystem is mounted or not
+ *
+ * @cgroup: The group structure to be queried
+ * @controller: cgroup subsystem id
+ *
+ * Returns true if a cgroup is subsystem is mounted.
+ */
+bool virCgroupMounted(virCgroupPtr cgroup, int controller)
+{
+    return cgroup->controllers[controller].mountPoint != NULL;
+}
+
 #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
 /*
  * Process /proc/mounts figuring out what controllers are
index b8f2d0899b255073a2222aa38528c2fa11fa39b1..9e1c61fca500c2539065ed212fb765d1b2344786 100644 (file)
@@ -83,5 +83,6 @@ int virCgroupGetFreezerState(virCgroupPtr group, char **state);
 int virCgroupRemove(virCgroupPtr group);
 
 void virCgroupFree(virCgroupPtr *group);
+bool virCgroupMounted(virCgroupPtr cgroup, int controller);
 
 #endif /* CGROUP_H */