return -1;
}
-
-static int virCgroupAppRoot(virCgroupPtr *group,
- bool create,
- int controllers)
-{
- virCgroupPtr selfgrp = NULL;
- int ret = -1;
-
- if (virCgroupNewSelf(&selfgrp) < 0)
- return -1;
-
- if (virCgroupNew(-1, "libvirt", selfgrp, controllers, group) < 0)
- goto cleanup;
-
- if (virCgroupMakeGroup(selfgrp, *group, create, VIR_CGROUP_NONE) < 0)
- goto cleanup;
-
- ret = 0;
-cleanup:
- virCgroupFree(&selfgrp);
- return ret;
-}
#endif
#if defined _DIRENT_HAVE_D_TYPE
}
#endif
-/**
- * virCgroupNewDriver:
- *
- * @name: name of this driver (e.g., xen, qemu, lxc)
- * @group: Pointer to returned virCgroupPtr
- *
- * Returns 0 on success, or -1 on error
- */
-#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
-int virCgroupNewDriver(const char *name,
- bool create,
- int controllers,
- virCgroupPtr *group)
-{
- int ret = -1;
- virCgroupPtr rootgrp = NULL;
-
- if (virCgroupAppRoot(&rootgrp,
- create, controllers) < 0)
- goto cleanup;
-
- if (virCgroupNew(-1, name, rootgrp, -1, group) < 0)
- goto cleanup;
-
- if (virCgroupMakeGroup(rootgrp, *group, create, VIR_CGROUP_NONE) < 0) {
- virCgroupRemove(*group);
- virCgroupFree(group);
- goto cleanup;
- }
-
- ret = 0;
-
-cleanup:
- virCgroupFree(&rootgrp);
- return ret;
-}
-#else
-int virCgroupNewDriver(const char *name ATTRIBUTE_UNUSED,
- bool create ATTRIBUTE_UNUSED,
- int controllers ATTRIBUTE_UNUSED,
- virCgroupPtr *group ATTRIBUTE_UNUSED)
-{
- virReportSystemError(ENXIO, "%s",
- _("Control groups not supported on this platform"));
- return -1;
-}
-#endif
/**
* virCgroupNewSelf:
}
-/**
- * virCgroupNewDomainDriver:
- *
- * @driver: group for driver owning the domain
- * @name: name of the domain
- * @group: Pointer to returned virCgroupPtr
- *
- * Returns 0 on success, or -1 on error
- */
-#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
-int virCgroupNewDomainDriver(virCgroupPtr driver,
- const char *name,
- bool create,
- virCgroupPtr *group)
-{
- int ret = -1;
-
- if (virCgroupNew(-1, name, driver, -1, group) < 0)
- goto cleanup;
-
- /*
- * Create a cgroup with memory.use_hierarchy enabled to
- * surely account memory usage of lxc with ns subsystem
- * enabled. (To be exact, memory and ns subsystems are
- * enabled at the same time.)
- *
- * The reason why doing it here, not a upper group, say
- * a group for driver, is to avoid overhead to track
- * cumulative usage that we don't need.
- */
- if (virCgroupMakeGroup(driver, *group, create, VIR_CGROUP_MEM_HIERACHY) < 0) {
- virCgroupRemove(*group);
- virCgroupFree(group);
- goto cleanup;
- }
-
- ret = 0;
-cleanup:
- return ret;
-}
-#else
-int virCgroupNewDomainDriver(virCgroupPtr driver ATTRIBUTE_UNUSED,
- const char *name ATTRIBUTE_UNUSED,
- bool create ATTRIBUTE_UNUSED,
- virCgroupPtr *group ATTRIBUTE_UNUSED)
-{
- virReportSystemError(ENXIO, "%s",
- _("Control groups not supported on this platform"));
- return -1;
-}
-#endif
-
/**
* virCgroupNewDomainPartition:
*
/* Asking for impossible combination since CPU is co-mounted */
-static int testCgroupNewForDriver(const void *args ATTRIBUTE_UNUSED)
-{
- virCgroupPtr cgroup = NULL;
- int ret = -1;
- int rv;
- const char *placementSmall[VIR_CGROUP_CONTROLLER_LAST] = {
- [VIR_CGROUP_CONTROLLER_CPU] = "/system/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_CPUACCT] = "/system/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
- [VIR_CGROUP_CONTROLLER_MEMORY] = "/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
- [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
- [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
- };
- const char *placementFull[VIR_CGROUP_CONTROLLER_LAST] = {
- [VIR_CGROUP_CONTROLLER_CPU] = "/system/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_CPUACCT] = "/system/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_CPUSET] = "/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_MEMORY] = "/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
- [VIR_CGROUP_CONTROLLER_FREEZER] = "/libvirt/lxc",
- [VIR_CGROUP_CONTROLLER_BLKIO] = "/libvirt/lxc",
- };
-
- if ((rv = virCgroupNewDriver("lxc", false, -1, &cgroup)) != -1) {
- fprintf(stderr, "Unexpected found LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
- ENSURE_ERRNO(ENOENT);
-
- if ((rv = virCgroupNewDriver("lxc", true,
- (1 << VIR_CGROUP_CONTROLLER_CPU),
- &cgroup)) != -1) {
- fprintf(stderr, "Should not have created LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
- ENSURE_ERRNO(EINVAL);
-
- /* Asking for impossible combination since devices is not mounted */
- if ((rv = virCgroupNewDriver("lxc", true,
- (1 << VIR_CGROUP_CONTROLLER_DEVICES),
- &cgroup)) != -1) {
- fprintf(stderr, "Should not have created LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
- ENSURE_ERRNO(ENXIO);
-
- /* Asking for small combination since devices is not mounted */
- if ((rv = virCgroupNewDriver("lxc", true,
- (1 << VIR_CGROUP_CONTROLLER_CPU) |
- (1 << VIR_CGROUP_CONTROLLER_CPUACCT) |
- (1 << VIR_CGROUP_CONTROLLER_MEMORY),
- &cgroup)) != 0) {
- fprintf(stderr, "Cannot create LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
- ret = validateCgroup(cgroup, "libvirt/lxc", mountsSmall, links, placementSmall);
- virCgroupFree(&cgroup);
-
- if ((rv = virCgroupNewDriver("lxc", true, -1, &cgroup)) != 0) {
- fprintf(stderr, "Cannot create LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
- ret = validateCgroup(cgroup, "libvirt/lxc", mountsFull, links, placementFull);
-
-cleanup:
- virCgroupFree(&cgroup);
- return ret;
-}
-
-
-static int testCgroupNewForDriverDomain(const void *args ATTRIBUTE_UNUSED)
-{
- virCgroupPtr drivercgroup = NULL;
- virCgroupPtr domaincgroup = NULL;
- int ret = -1;
- int rv;
- const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
- [VIR_CGROUP_CONTROLLER_CPU] = "/system/libvirt/lxc/wibble",
- [VIR_CGROUP_CONTROLLER_CPUACCT] = "/system/libvirt/lxc/wibble",
- [VIR_CGROUP_CONTROLLER_CPUSET] = "/libvirt/lxc/wibble",
- [VIR_CGROUP_CONTROLLER_MEMORY] = "/libvirt/lxc/wibble",
- [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
- [VIR_CGROUP_CONTROLLER_FREEZER] = "/libvirt/lxc/wibble",
- [VIR_CGROUP_CONTROLLER_BLKIO] = "/libvirt/lxc/wibble",
- };
-
- if ((rv = virCgroupNewDriver("lxc", false, -1, &drivercgroup)) != 0) {
- fprintf(stderr, "Cannot find LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
-
- if ((rv = virCgroupNewDomainDriver(drivercgroup, "wibble", true, &domaincgroup)) != 0) {
- fprintf(stderr, "Cannot create LXC cgroup: %d\n", -rv);
- goto cleanup;
- }
-
- ret = validateCgroup(domaincgroup, "libvirt/lxc/wibble", mountsFull, links, placement);
-
-cleanup:
- virCgroupFree(&drivercgroup);
- virCgroupFree(&domaincgroup);
- return ret;
-}
-
-
static int testCgroupNewForPartition(const void *args ATTRIBUTE_UNUSED)
{
virCgroupPtr cgroup = NULL;
if (virtTestRun("New cgroup for self", 1, testCgroupNewForSelf, NULL) < 0)
ret = -1;
- if (virtTestRun("New cgroup for driver", 1, testCgroupNewForDriver, NULL) < 0)
- ret = -1;
-
- if (virtTestRun("New cgroup for domain driver", 1, testCgroupNewForDriverDomain, NULL) < 0)
- ret = -1;
-
if (virtTestRun("New cgroup for partition", 1, testCgroupNewForPartition, NULL) < 0)
ret = -1;