mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 23:37:42 +00:00
LXC: allow uses advisory nodeset from querying numad
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@cn.fujitsu.com>
This commit is contained in:
parent
763edb5ebe
commit
c9759a7b63
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2010-2012 Red Hat, Inc.
|
* Copyright (C) 2010-2013 Red Hat, Inc.
|
||||||
* Copyright IBM Corp. 2008
|
* Copyright IBM Corp. 2008
|
||||||
*
|
*
|
||||||
* lxc_controller.c: linux container process controller
|
* lxc_controller.c: linux container process controller
|
||||||
@ -69,6 +69,7 @@
|
|||||||
#include "nodeinfo.h"
|
#include "nodeinfo.h"
|
||||||
#include "virrandom.h"
|
#include "virrandom.h"
|
||||||
#include "virprocess.h"
|
#include "virprocess.h"
|
||||||
|
#include "virnuma.h"
|
||||||
#include "rpc/virnetserver.h"
|
#include "rpc/virnetserver.h"
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_LXC
|
#define VIR_FROM_THIS VIR_FROM_LXC
|
||||||
@ -469,7 +470,8 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if WITH_NUMACTL
|
#if WITH_NUMACTL
|
||||||
static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
|
static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl,
|
||||||
|
virBitmapPtr nodemask)
|
||||||
{
|
{
|
||||||
nodemask_t mask;
|
nodemask_t mask;
|
||||||
int mode = -1;
|
int mode = -1;
|
||||||
@ -478,9 +480,22 @@ static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
int maxnode = 0;
|
int maxnode = 0;
|
||||||
bool warned = false;
|
bool warned = false;
|
||||||
|
virDomainNumatuneDef numatune = ctrl->def->numatune;
|
||||||
|
virBitmapPtr tmp_nodemask = NULL;
|
||||||
|
|
||||||
if (!ctrl->def->numatune.memory.nodemask)
|
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;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
VIR_DEBUG("Setting NUMA memory policy");
|
VIR_DEBUG("Setting NUMA memory policy");
|
||||||
|
|
||||||
@ -495,7 +510,7 @@ static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
|
|||||||
/* Convert nodemask to NUMA bitmask. */
|
/* Convert nodemask to NUMA bitmask. */
|
||||||
nodemask_zero(&mask);
|
nodemask_zero(&mask);
|
||||||
i = -1;
|
i = -1;
|
||||||
while ((i = virBitmapNextSetBit(ctrl->def->numatune.memory.nodemask, i)) >= 0) {
|
while ((i = virBitmapNextSetBit(tmp_nodemask, i)) >= 0) {
|
||||||
if (i > NUMA_NUM_NODES) {
|
if (i > NUMA_NUM_NODES) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("Host cannot support NUMA node %d"), i);
|
_("Host cannot support NUMA node %d"), i);
|
||||||
@ -548,7 +563,8 @@ cleanup:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
|
static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl,
|
||||||
|
virBitmapPtr nodemask ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
if (ctrl->def->numatune.memory.nodemask) {
|
if (ctrl->def->numatune.memory.nodemask) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
@ -609,6 +625,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
|
* virLXCControllerSetupResourceLimits
|
||||||
* @ctrl: the controller state
|
* @ctrl: the controller state
|
||||||
@ -621,14 +671,23 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
|
|||||||
static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl,
|
static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl,
|
||||||
virCgroupPtr cgroup)
|
virCgroupPtr cgroup)
|
||||||
{
|
{
|
||||||
|
virBitmapPtr nodemask = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virLXCControllerGetNumadAdvice(ctrl, &nodemask) < 0 ||
|
||||||
|
virLXCControllerSetupNUMAPolicy(ctrl, nodemask) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (virLXCControllerSetupCpuAffinity(ctrl) < 0)
|
if (virLXCControllerSetupCpuAffinity(ctrl) < 0)
|
||||||
return -1;
|
goto cleanup;
|
||||||
|
|
||||||
if (virLXCControllerSetupNUMAPolicy(ctrl) < 0)
|
if (virLXCCgroupSetup(ctrl->def, cgroup) < 0)
|
||||||
return -1;
|
goto cleanup;
|
||||||
|
|
||||||
return virLXCCgroupSetup(ctrl->def, cgroup);
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
virBitmapFree(nodemask);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user