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: Lai Jiangshan <laijs@cn.fujitsu.com>
This commit is contained in:
Lai Jiangshan 2010-10-29 17:32:16 +08:00 committed by Eric Blake
parent 4c2b3e1d29
commit 41b2cee2a8
4 changed files with 17 additions and 0 deletions

View File

@ -72,6 +72,7 @@ virCgroupGetMemoryHardLimit;
virCgroupGetMemorySoftLimit;
virCgroupGetMemoryUsage;
virCgroupGetSwapHardLimit;
virCgroupMounted;
virCgroupRemove;
virCgroupSetCpuShares;
virCgroupSetFreezerState;

View 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;

View 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

View 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 */