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

virDomainNumatuneGetMode: Report if numatune was defined

So far, we are not reporting if numatune was even defined. The
value of zero is blindly returned (which maps onto
VIR_DOMAIN_NUMATUNE_MEM_STRICT). Unfortunately, we are making
decisions based on this value. Instead, we should not only return
the correct value, but report to the caller if the value is valid
at all.

For better viewing of this patch use '-w'.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 99a2d6af
...@@ -351,20 +351,40 @@ virDomainNumaFree(virDomainNumaPtr numa) ...@@ -351,20 +351,40 @@ virDomainNumaFree(virDomainNumaPtr numa)
VIR_FREE(numa); VIR_FREE(numa);
} }
virDomainNumatuneMemMode /**
virDomainNumatuneGetMode(virDomainNumaPtr numatune, * virDomainNumatuneGetMode:
int cellid) * @numatune: pointer to numatune definition
* @cellid: cell selector
* @mode: where to store the result
*
* Get the defined mode for domain's memory. It's safe to pass
* NULL to @mode if the return value is the only info needed.
*
* Returns: 0 on success (with @mode updated)
* -1 if no mode was defined in XML
*/
int virDomainNumatuneGetMode(virDomainNumaPtr numatune,
int cellid,
virDomainNumatuneMemMode *mode)
{ {
int ret = -1;
virDomainNumatuneMemMode tmp_mode;
if (!numatune) if (!numatune)
return 0; return ret;
if (virDomainNumatuneNodeSpecified(numatune, cellid)) if (virDomainNumatuneNodeSpecified(numatune, cellid))
return numatune->mem_nodes[cellid].mode; tmp_mode = numatune->mem_nodes[cellid].mode;
else if (numatune->memory.specified)
if (numatune->memory.specified) tmp_mode = numatune->memory.mode;
return numatune->memory.mode; else
goto cleanup;
return 0; if (mode)
*mode = tmp_mode;
ret = 0;
cleanup:
return ret;
} }
virBitmapPtr virBitmapPtr
......
...@@ -72,8 +72,9 @@ int virDomainNumatuneFormatXML(virBufferPtr buf, virDomainNumaPtr numatune) ...@@ -72,8 +72,9 @@ int virDomainNumatuneFormatXML(virBufferPtr buf, virDomainNumaPtr numatune)
/* /*
* Getters * Getters
*/ */
virDomainNumatuneMemMode virDomainNumatuneGetMode(virDomainNumaPtr numatune, int virDomainNumatuneGetMode(virDomainNumaPtr numatune,
int cellid); int cellid,
virDomainNumatuneMemMode *mode);
virBitmapPtr virDomainNumatuneGetNodeset(virDomainNumaPtr numatune, virBitmapPtr virDomainNumatuneGetNodeset(virDomainNumaPtr numatune,
virBitmapPtr auto_nodeset, virBitmapPtr auto_nodeset,
......
...@@ -69,6 +69,7 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def, ...@@ -69,6 +69,7 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def,
{ {
int ret = -1; int ret = -1;
char *mask = NULL; char *mask = NULL;
virDomainNumatuneMemMode mode;
if (def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO && if (def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO &&
def->cpumask) { def->cpumask) {
...@@ -81,8 +82,8 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def, ...@@ -81,8 +82,8 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def,
VIR_FREE(mask); VIR_FREE(mask);
} }
if (virDomainNumatuneGetMode(def->numa, -1) != if (virDomainNumatuneGetMode(def->numa, -1, &mode) < 0 ||
VIR_DOMAIN_NUMATUNE_MEM_STRICT) { mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
ret = 0; ret = 0;
goto cleanup; goto cleanup;
} }
......
...@@ -741,25 +741,25 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl) ...@@ -741,25 +741,25 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl)
virBitmapPtr nodeset = NULL; virBitmapPtr nodeset = NULL;
virDomainNumatuneMemMode mode; virDomainNumatuneMemMode mode;
mode = virDomainNumatuneGetMode(ctrl->def->numa, -1); if (virDomainNumatuneGetMode(ctrl->def->numa, -1, &mode) == 0) {
if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT && virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) {
virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) { /* Use virNuma* API iff necessary. Once set and child is exec()-ed,
/* 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
* there's no way for us to change it. Rely on cgroups (if available * and enabled in the config) rather than virNuma*. */
* and enabled in the config) rather than virNuma*. */ VIR_DEBUG("Relying on CGroups for memory binding");
VIR_DEBUG("Relying on CGroups for memory binding"); } else {
} else {
VIR_DEBUG("Setting up process resource limits"); VIR_DEBUG("Setting up process resource limits");
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0) if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
goto cleanup; goto cleanup;
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numa, auto_nodeset, -1); nodeset = virDomainNumatuneGetNodeset(ctrl->def->numa, auto_nodeset, -1);
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0) if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
goto cleanup; goto cleanup;
}
} }
if (virLXCControllerSetupCpuAffinity(ctrl) < 0) if (virLXCControllerSetupCpuAffinity(ctrl) < 0)
......
...@@ -1845,6 +1845,7 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def) ...@@ -1845,6 +1845,7 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def)
size_t i; size_t i;
PRL_VM_TYPE vmType; PRL_VM_TYPE vmType;
PRL_RESULT pret; PRL_RESULT pret;
virDomainNumatuneMemMode memMode;
if (def->title) { if (def->title) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
...@@ -1924,8 +1925,8 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def) ...@@ -1924,8 +1925,8 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def)
* virDomainDefPtr always contain non zero NUMA configuration * virDomainDefPtr always contain non zero NUMA configuration
* So, just make sure this configuration does't differ from auto generated. * So, just make sure this configuration does't differ from auto generated.
*/ */
if ((virDomainNumatuneGetMode(def->numa, -1) != if ((virDomainNumatuneGetMode(def->numa, -1, &memMode) == 0 &&
VIR_DOMAIN_NUMATUNE_MEM_STRICT) || memMode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) ||
virDomainNumatuneHasPerNodeBinding(def->numa)) { virDomainNumatuneHasPerNodeBinding(def->numa)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("numa parameters are not supported " _("numa parameters are not supported "
......
...@@ -613,14 +613,15 @@ qemuSetupCpusetMems(virDomainObjPtr vm) ...@@ -613,14 +613,15 @@ qemuSetupCpusetMems(virDomainObjPtr vm)
{ {
virCgroupPtr cgroup_temp = NULL; virCgroupPtr cgroup_temp = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainNumatuneMemMode mode;
char *mem_mask = NULL; char *mem_mask = NULL;
int ret = -1; int ret = -1;
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
return 0; return 0;
if (virDomainNumatuneGetMode(vm->def->numa, -1) != if (virDomainNumatuneGetMode(vm->def->numa, -1, &mode) < 0 ||
VIR_DOMAIN_NUMATUNE_MEM_STRICT) mode != VIR_DOMAIN_NUMATUNE_MEM_STRICT)
return 0; return 0;
if (virDomainNumatuneMaybeFormatNodeset(vm->def->numa, if (virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
...@@ -979,6 +980,7 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm) ...@@ -979,6 +980,7 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
unsigned long long period = vm->def->cputune.period; unsigned long long period = vm->def->cputune.period;
long long quota = vm->def->cputune.quota; long long quota = vm->def->cputune.quota;
char *mem_mask = NULL; char *mem_mask = NULL;
virDomainNumatuneMemMode mem_mode;
if ((period || quota) && if ((period || quota) &&
!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) { !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
...@@ -1009,8 +1011,8 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm) ...@@ -1009,8 +1011,8 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
return 0; return 0;
} }
if (virDomainNumatuneGetMode(vm->def->numa, -1) == if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
VIR_DOMAIN_NUMATUNE_MEM_STRICT && mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
virDomainNumatuneMaybeFormatNodeset(vm->def->numa, virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
priv->autoNodeset, priv->autoNodeset,
&mem_mask, -1) < 0) &mem_mask, -1) < 0)
...@@ -1153,6 +1155,7 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm) ...@@ -1153,6 +1155,7 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm)
unsigned long long period = vm->def->cputune.period; unsigned long long period = vm->def->cputune.period;
long long quota = vm->def->cputune.quota; long long quota = vm->def->cputune.quota;
char *mem_mask = NULL; char *mem_mask = NULL;
virDomainNumatuneMemMode mem_mode;
if ((period || quota) && if ((period || quota) &&
!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) { !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
...@@ -1176,8 +1179,8 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm) ...@@ -1176,8 +1179,8 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm)
if (priv->cgroup == NULL) if (priv->cgroup == NULL)
return 0; return 0;
if (virDomainNumatuneGetMode(vm->def->numa, -1) == if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
VIR_DOMAIN_NUMATUNE_MEM_STRICT && mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
virDomainNumatuneMaybeFormatNodeset(vm->def->numa, virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
priv->autoNodeset, priv->autoNodeset,
&mem_mask, -1) < 0) &mem_mask, -1) < 0)
......
...@@ -4707,7 +4707,9 @@ qemuBuildMemoryBackendStr(unsigned long long size, ...@@ -4707,7 +4707,9 @@ qemuBuildMemoryBackendStr(unsigned long long size,
return -1; return -1;
memAccess = virDomainNumaGetNodeMemoryAccessMode(def->numa, guestNode); memAccess = virDomainNumaGetNodeMemoryAccessMode(def->numa, guestNode);
mode = virDomainNumatuneGetMode(def->numa, guestNode); if (virDomainNumatuneGetMode(def->numa, guestNode, &mode) < 0 &&
virDomainNumatuneGetMode(def->numa, -1, &mode) < 0)
mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
if (pagesize == 0 || pagesize != system_page_size) { if (pagesize == 0 || pagesize != system_page_size) {
/* Find the huge page size we want to use */ /* Find the huge page size we want to use */
......
...@@ -4737,6 +4737,7 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver, ...@@ -4737,6 +4737,7 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
int ncpupids; int ncpupids;
virCgroupPtr cgroup_vcpu = NULL; virCgroupPtr cgroup_vcpu = NULL;
char *mem_mask = NULL; char *mem_mask = NULL;
virDomainNumatuneMemMode mem_mode;
qemuDomainObjEnterMonitor(driver, vm); qemuDomainObjEnterMonitor(driver, vm);
...@@ -4804,8 +4805,8 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver, ...@@ -4804,8 +4805,8 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
goto cleanup; goto cleanup;
} }
if (virDomainNumatuneGetMode(vm->def->numa, -1) == if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
VIR_DOMAIN_NUMATUNE_MEM_STRICT && mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
virDomainNumatuneMaybeFormatNodeset(vm->def->numa, virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
priv->autoNodeset, priv->autoNodeset,
&mem_mask, -1) < 0) &mem_mask, -1) < 0)
...@@ -6113,6 +6114,7 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver, ...@@ -6113,6 +6114,7 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
qemuMonitorIOThreadInfoPtr *new_iothreads = NULL; qemuMonitorIOThreadInfoPtr *new_iothreads = NULL;
virCgroupPtr cgroup_iothread = NULL; virCgroupPtr cgroup_iothread = NULL;
char *mem_mask = NULL; char *mem_mask = NULL;
virDomainNumatuneMemMode mode;
virDomainIOThreadIDDefPtr iothrid; virDomainIOThreadIDDefPtr iothrid;
virBitmapPtr cpumask; virBitmapPtr cpumask;
...@@ -6154,8 +6156,8 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver, ...@@ -6154,8 +6156,8 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
} }
vm->def->iothreads = exp_niothreads; vm->def->iothreads = exp_niothreads;
if (virDomainNumatuneGetMode(vm->def->numa, -1) == if (virDomainNumatuneGetMode(vm->def->numa, -1, &mode) == 0 &&
VIR_DOMAIN_NUMATUNE_MEM_STRICT && mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
virDomainNumatuneMaybeFormatNodeset(vm->def->numa, virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
priv->autoNodeset, priv->autoNodeset,
&mem_mask, -1) < 0) &mem_mask, -1) < 0)
...@@ -10331,11 +10333,12 @@ qemuDomainSetNumaParamsLive(virDomainObjPtr vm, ...@@ -10331,11 +10333,12 @@ qemuDomainSetNumaParamsLive(virDomainObjPtr vm,
virCgroupPtr cgroup_temp = NULL; virCgroupPtr cgroup_temp = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
char *nodeset_str = NULL; char *nodeset_str = NULL;
virDomainNumatuneMemMode mode;
size_t i = 0; size_t i = 0;
int ret = -1; int ret = -1;
if (virDomainNumatuneGetMode(vm->def->numa, -1) != if (virDomainNumatuneGetMode(vm->def->numa, -1, &mode) < 0 ||
VIR_DOMAIN_NUMATUNE_MEM_STRICT) { mode != VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s", virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("change of nodeset for running domain " _("change of nodeset for running domain "
"requires strict numa mode")); "requires strict numa mode"));
...@@ -10392,6 +10395,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, ...@@ -10392,6 +10395,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
virCapsPtr caps = NULL; virCapsPtr caps = NULL;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
virBitmapPtr nodeset = NULL; virBitmapPtr nodeset = NULL;
virDomainNumatuneMemMode config_mode;
int mode = -1; int mode = -1;
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
...@@ -10467,7 +10471,8 @@ qemuDomainSetNumaParameters(virDomainPtr dom, ...@@ -10467,7 +10471,8 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
if (flags & VIR_DOMAIN_AFFECT_LIVE) { if (flags & VIR_DOMAIN_AFFECT_LIVE) {
if (mode != -1 && if (mode != -1 &&
virDomainNumatuneGetMode(vm->def->numa, -1) != mode) { virDomainNumatuneGetMode(vm->def->numa, -1, &config_mode) == 0 &&
config_mode != mode) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s", virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("can't change numatune mode for running domain")); _("can't change numatune mode for running domain"));
goto endjob; goto endjob;
...@@ -10568,7 +10573,8 @@ qemuDomainGetNumaParameters(virDomainPtr dom, ...@@ -10568,7 +10573,8 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
VIR_TYPED_PARAM_INT, 0) < 0) VIR_TYPED_PARAM_INT, 0) < 0)
goto cleanup; goto cleanup;
param->value.i = virDomainNumatuneGetMode(def->numa, -1); virDomainNumatuneGetMode(def->numa, -1,
(virDomainNumatuneMemMode *) &param->value.i);
break; break;
case 1: /* fill numa nodeset here */ case 1: /* fill numa nodeset here */
......
...@@ -3135,21 +3135,21 @@ static int qemuProcessHook(void *data) ...@@ -3135,21 +3135,21 @@ static int qemuProcessHook(void *data)
if (virSecurityManagerClearSocketLabel(h->driver->securityManager, h->vm->def) < 0) if (virSecurityManagerClearSocketLabel(h->driver->securityManager, h->vm->def) < 0)
goto cleanup; goto cleanup;
mode = virDomainNumatuneGetMode(h->vm->def->numa, -1); if (virDomainNumatuneGetMode(h->vm->def->numa, -1, &mode) == 0) {
if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT && h->cfg->cgroupControllers & (1 << VIR_CGROUP_CONTROLLER_CPUSET) &&
h->cfg->cgroupControllers & (1 << VIR_CGROUP_CONTROLLER_CPUSET) && virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) {
virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) { /* Use virNuma* API iff necessary. Once set and child is exec()-ed,
/* 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
* there's no way for us to change it. Rely on cgroups (if available * and enabled in the config) rather than virNuma*. */
* and enabled in the config) rather than virNuma*. */ VIR_DEBUG("Relying on CGroups for memory binding");
VIR_DEBUG("Relying on CGroups for memory binding"); } else {
} else { nodeset = virDomainNumatuneGetNodeset(h->vm->def->numa,
nodeset = virDomainNumatuneGetNodeset(h->vm->def->numa, priv->autoNodeset, -1);
priv->autoNodeset, -1);
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0) if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
goto cleanup; goto cleanup;
}
} }
ret = 0; ret = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册