[libvirt] [PATCH v3 2/4] LXC: allow uses advisory nodeset from querying numad

Osier Yang jyang at redhat.com
Mon Mar 18 09:27:55 UTC 2013


On 2013年03月18日 17:04, Gao feng wrote:
> Allow lxc using the advisory nodeset from querying numad,
> this means if user doesn't specify the numa nodes that
> the lxc domain should assign to, libvirt will automatically
> bind the lxc domain to the advisory nodeset which queried from
> numad.
> 
> Signed-off-by: Gao feng<gaofeng at cn.fujitsu.com>
> ---
>   src/lxc/lxc_controller.c | 77 ++++++++++++++++++++++++++++++++++++++++++------
>   1 file changed, 68 insertions(+), 9 deletions(-)
> 
> diff --git PATCH v3src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index becf811..bb4cd16 100644
> --- PATCH v3src/lxc/lxc_controller.c	
> +++ b/src/lxc/lxc_controller.c
> @@ -69,6 +69,7 @@
>   #include "nodeinfo.h"
>   #include "virrandom.h"
>   #include "virprocess.h"
> +#include "virnuma.h"
>   #include "rpc/virnetserver.h"
> 
>   #define VIR_FROM_THIS VIR_FROM_LXC
> @@ -479,7 +480,8 @@ cleanup:
>   }
> 
>   #if WITH_NUMACTL
> -static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
> +static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl,
> +                                           virBitmapPtr nodemask)
>   {
>       nodemask_t mask;
>       int mode = -1;
> @@ -488,9 +490,22 @@ static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
>       int i = 0;
>       int maxnode = 0;
>       bool warned = false;
> -
> -    if (!ctrl->def->numatune.memory.nodemask)
> +    virDomainNumatuneDef numatune = ctrl->def->numatune;
> +    virBitmapPtr tmp_nodemask = NULL;
> +
> +    if (numatune.memory.placement_mode ==
> +        VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_STATIC) {
> +        if (!numatune.memory.nodemask)
> +            return 0;
> +        VIR_DEBUG("Set NUMA memory policy with specified nodeset");
> +        tmp_nodemask = numatune.memory.nodemask;
> +    } else if (numatune.memory.placement_mode ==
> +               VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO) {
> +        VIR_DEBUG("Set NUMA memory policy with advisory nodeset from numad");
> +        tmp_nodemask = nodemask;
> +    } else {
>           return 0;
> +    }
> 
>       VIR_DEBUG("Setting NUMA memory policy");
> 
> @@ -505,7 +520,7 @@ static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
>       /* Convert nodemask to NUMA bitmask. */
>       nodemask_zero(&mask);
>       i = -1;
> -    while ((i = virBitmapNextSetBit(ctrl->def->numatune.memory.nodemask, i))>= 0) {
> +    while ((i = virBitmapNextSetBit(tmp_nodemask, i))>= 0) {
>           if (i>  NUMA_NUM_NODES) {
>               virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                              _("Host cannot support NUMA node %d"), i);
> @@ -558,7 +573,8 @@ cleanup:
>       return ret;
>   }
>   #else
> -static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
> +static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl,
> +                                           virBitmapPtr nodemask ATTRIBUTE_UNUSED)
>   {
>       if (ctrl->def->numatune.memory.nodemask) {
>           virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> @@ -619,6 +635,40 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
>   }
> 
> 
> +static int virLXCControllerGetNumadAdvice(virLXCControllerPtr ctrl,
> +                                          virBitmapPtr *mask)
> +{
> +    virBitmapPtr nodemask = NULL;
> +    char *nodeset;
> +    int ret = -1;
> +
> +    /* Get the advisory nodeset from numad if 'placement' of
> +     * either<vcpu>  or<numatune>  is 'auto'.
> +     */
> +    if ((ctrl->def->placement_mode ==
> +         VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) ||
> +        (ctrl->def->numatune.memory.placement_mode ==
> +         VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO)) {
> +        nodeset = virNumaGetAutoPlacementAdvice(ctrl->def->vcpus,
> +                                                ctrl->def->mem.cur_balloon);
> +        if (!nodeset)
> +            goto cleanup;
> +
> +        VIR_DEBUG("Nodeset returned from numad: %s", nodeset);
> +
> +        if (virBitmapParse(nodeset, 0,&nodemask, VIR_DOMAIN_CPUMASK_LEN)<  0)
> +            goto cleanup;
> +    }
> +
> +    ret = 0;
> +    *mask = nodemask;
> +
> +cleanup:
> +    VIR_FREE(nodeset);
> +    return ret;
> +}
> +
> +
>   /**
>    * virLXCControllerSetupResourceLimits
>    * @ctrl: the controller state
> @@ -630,14 +680,23 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
>    */
>   static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl)
>   {
> +    virBitmapPtr nodemask = NULL;
> +    int ret = -1;
> +
> +    if (virLXCControllerGetNumadAdvice(ctrl,&nodemask)<  0 ||
> +        virLXCControllerSetupNUMAPolicy(ctrl, nodemask)<  0)
> +        goto cleanup;
> 
>       if (virLXCControllerSetupCpuAffinity(ctrl)<  0)
> -        return -1;
> +        goto cleanup;
> 
> -    if (virLXCControllerSetupNUMAPolicy(ctrl)<  0)
> -        return -1;
> +    if (virLXCCgroupSetup(ctrl->def)<  0)
> +        goto cleanup;
> 
> -    return virLXCCgroupSetup(ctrl->def);
> +    ret = 0;
> +cleanup:
> +    virBitmapFree(nodemask);
> +    return ret;
>   }
> 
> 

ACK.




More information about the libvir-list mailing list