提交 41b2cee2 编写于 作者: L Lai Jiangshan 提交者: Eric Blake

qemu_driver: add virCgroupMounted

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: NLai Jiangshan <laijs@cn.fujitsu.com>
上级 4c2b3e1d
......@@ -72,6 +72,7 @@ virCgroupGetMemoryHardLimit;
virCgroupGetMemorySoftLimit;
virCgroupGetMemoryUsage;
virCgroupGetSwapHardLimit;
virCgroupMounted;
virCgroupRemove;
virCgroupSetCpuShares;
virCgroupSetFreezerState;
......
......@@ -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;
......
......@@ -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
......
......@@ -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 */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册