[libvirt] [PATCH 5/5] Refactor initial LXC mem tune / device ACL code
Daniel Veillard
veillard at redhat.com
Thu Nov 24 14:10:53 UTC 2011
On Thu, Nov 24, 2011 at 11:38:16AM +0000, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> To make lxcSetContainerResources smaller, pull the mem tune
> and device ACL setup code out into separate methods
>
> * src/lxc/lxc_controller.c: Introduce lxcSetContainerMemTune
> and lxcSetContainerDeviceACL
> ---
> src/lxc/lxc_controller.c | 138 +++++++++++++++++++++++++++------------------
> 1 files changed, 83 insertions(+), 55 deletions(-)
>
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index c17b172..f5e38a7 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -438,61 +438,10 @@ cleanup:
> }
>
>
> -/**
> - * lxcSetContainerResources
> - * @def: pointer to virtual machine structure
> - *
> - * Creates a cgroup for the container, moves the task inside,
> - * and sets resource limits
> - *
> - * Returns 0 on success or -1 in case of error
> - */
> -static int lxcSetContainerResources(virDomainDefPtr def)
> +static int lxcSetContainerMemTune(virCgroupPtr cgroup, virDomainDefPtr def)
> {
> - virCgroupPtr driver;
> - virCgroupPtr cgroup;
> - int rc = -1;
> - int i;
> - struct cgroup_device_policy devices[] = {
> - {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_NULL},
> - {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_ZERO},
> - {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_FULL},
> - {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_RANDOM},
> - {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_URANDOM},
> - {'c', LXC_DEV_MAJ_TTY, LXC_DEV_MIN_TTY},
> - {'c', LXC_DEV_MAJ_TTY, LXC_DEV_MIN_PTMX},
> - {0, 0, 0}};
> -
> - if (lxcSetContainerCpuAffinity(def) < 0)
> - return -1;
> -
> - if (lxcSetContainerNUMAPolicy(def) < 0)
> - return -1;
> -
> - rc = virCgroupForDriver("lxc", &driver, 1, 0);
> - if (rc != 0) {
> - /* Skip all if no driver cgroup is configured */
> - if (rc == -ENXIO || rc == -ENOENT)
> - return 0;
> -
> - virReportSystemError(-rc, "%s",
> - _("Unable to get cgroup for driver"));
> - return rc;
> - }
> -
> - rc = virCgroupForDomain(driver, def->name, &cgroup, 1);
> - if (rc != 0) {
> - virReportSystemError(-rc,
> - _("Unable to create cgroup for domain %s"),
> - def->name);
> - goto cleanup;
> - }
> -
> - if (lxcSetContainerCpuTune(cgroup, def) < 0)
> - goto cleanup;
> -
> - if (lxcSetContainerBlkioTune(cgroup, def) < 0)
> - goto cleanup;
> + int ret = -1;
> + int rc;
>
> rc = virCgroupSetMemory(cgroup, def->mem.max_balloon);
> if (rc != 0) {
> @@ -532,6 +481,27 @@ static int lxcSetContainerResources(virDomainDefPtr def)
> }
> }
>
> + ret = 0;
> +cleanup:
> + return ret;
> +}
> +
> +
> +static int lxcSetContainerDeviceACL(virCgroupPtr cgroup, virDomainDefPtr def)
> +{
> + int ret = -1;
> + int rc;
> + size_t i;
> + static const struct cgroup_device_policy devices[] = {
> + {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_NULL},
> + {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_ZERO},
> + {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_FULL},
> + {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_RANDOM},
> + {'c', LXC_DEV_MAJ_MEMORY, LXC_DEV_MIN_URANDOM},
> + {'c', LXC_DEV_MAJ_TTY, LXC_DEV_MIN_TTY},
> + {'c', LXC_DEV_MAJ_TTY, LXC_DEV_MIN_PTMX},
> + {0, 0, 0}};
> +
> rc = virCgroupDenyAllDevices(cgroup);
> if (rc != 0) {
> virReportSystemError(-rc,
> @@ -541,7 +511,7 @@ static int lxcSetContainerResources(virDomainDefPtr def)
> }
>
> for (i = 0; devices[i].type != 0; i++) {
> - struct cgroup_device_policy *dev = &devices[i];
> + const struct cgroup_device_policy *dev = &devices[i];
> rc = virCgroupAllowDevice(cgroup,
> dev->type,
> dev->major,
> @@ -581,6 +551,64 @@ static int lxcSetContainerResources(virDomainDefPtr def)
> goto cleanup;
> }
>
> + ret = 0;
> +cleanup:
> + return ret;
> +}
> +
> +
> +/**
> + * lxcSetContainerResources
> + * @def: pointer to virtual machine structure
> + *
> + * Creates a cgroup for the container, moves the task inside,
> + * and sets resource limits
> + *
> + * Returns 0 on success or -1 in case of error
> + */
> +static int lxcSetContainerResources(virDomainDefPtr def)
> +{
> + virCgroupPtr driver;
> + virCgroupPtr cgroup;
> + int rc = -1;
> +
> + if (lxcSetContainerCpuAffinity(def) < 0)
> + return -1;
> +
> + if (lxcSetContainerNUMAPolicy(def) < 0)
> + return -1;
> +
> + rc = virCgroupForDriver("lxc", &driver, 1, 0);
> + if (rc != 0) {
> + /* Skip all if no driver cgroup is configured */
> + if (rc == -ENXIO || rc == -ENOENT)
> + return 0;
> +
> + virReportSystemError(-rc, "%s",
> + _("Unable to get cgroup for driver"));
> + return rc;
> + }
> +
> + rc = virCgroupForDomain(driver, def->name, &cgroup, 1);
> + if (rc != 0) {
> + virReportSystemError(-rc,
> + _("Unable to create cgroup for domain %s"),
> + def->name);
> + goto cleanup;
> + }
> +
> + if (lxcSetContainerCpuTune(cgroup, def) < 0)
> + goto cleanup;
> +
> + if (lxcSetContainerBlkioTune(cgroup, def) < 0)
> + goto cleanup;
> +
> + if (lxcSetContainerMemTune(cgroup, def) < 0)
> + goto cleanup;
> +
> + if (lxcSetContainerDeviceACL(cgroup, def) < 0)
> + goto cleanup;
> +
> rc = virCgroupAddTask(cgroup, getpid());
> if (rc != 0) {
> virReportSystemError(-rc,
ACK, it doesn't look like the refactoring changes the order of the operations,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list