提交 36256688 编写于 作者: M Michal Privoznik

virLXCControllerSetupResourceLimits: Call virNuma*() iff needed

Like we are doing in qemu driver (ea576ee5), lets call
virNumaSetupMemoryPolicy() only if really needed. Problem is, if
we numa_set_membind() child, there's no way to change it from the
daemon afterwards. So any later attempts to change the pinning
will fail. But in very weird way - CGroups will be set, but due
to membind child will not allocate memory from any other node.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 7cd0cf05
......@@ -742,16 +742,26 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl)
virBitmapPtr nodeset = NULL;
virDomainNumatuneMemMode mode;
VIR_DEBUG("Setting up process resource limits");
mode = virDomainNumatuneGetMode(ctrl->def->numa, -1);
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
goto cleanup;
if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) {
/* Use virNuma* API iff necessary. Once set and child is exec()-ed,
* there's no way for us to change it. Rely on cgroups (if available
* and enabled in the config) rather then virNuma*. */
VIR_DEBUG("Relying on CGroups for memory binding");
} else {
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numa, auto_nodeset, -1);
mode = virDomainNumatuneGetMode(ctrl->def->numa, -1);
VIR_DEBUG("Setting up process resource limits");
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
goto cleanup;
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
goto cleanup;
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numa, auto_nodeset, -1);
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
goto cleanup;
}
if (virLXCControllerSetupCpuAffinity(ctrl) < 0)
goto cleanup;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册