int mode,
virBitmapPtr nodeset)
{
- bool create = !*numatunePtr; /* Whether we are creating new struct */
+ bool created = false;
int ret = -1;
- virDomainNumatunePtr numatune = NULL;
+ virDomainNumatunePtr numatune;
/* No need to do anything in this case */
if (mode == -1 && placement == -1 && !nodeset)
return 0;
+ if (!(*numatunePtr)) {
+ if (VIR_ALLOC(*numatunePtr) < 0)
+ goto cleanup;
+
+ created = true;
+ if (mode == -1)
+ mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
+ if (placement == -1)
+ placement = VIR_DOMAIN_NUMATUNE_PLACEMENT_DEFAULT;
+ }
+
+ numatune = *numatunePtr;
+
/* Range checks */
if (mode != -1 &&
(mode < 0 || mode >= VIR_DOMAIN_NUMATUNE_MEM_LAST)) {
mode);
goto cleanup;
}
+
if (placement != -1 &&
(placement < 0 || placement >= VIR_DOMAIN_NUMATUNE_PLACEMENT_LAST)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
goto cleanup;
}
- if (create && VIR_ALLOC(*numatunePtr) < 0)
- goto cleanup;
- numatune = *numatunePtr;
-
- if (create) {
- /* Defaults for new struct */
- if (mode == -1)
- mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
-
- if (placement == -1)
- placement = VIR_DOMAIN_NUMATUNE_PLACEMENT_DEFAULT;
- }
-
if (mode != -1)
numatune->memory.mode = mode;
+
if (nodeset) {
virBitmapFree(numatune->memory.nodeset);
numatune->memory.nodeset = virBitmapNewCopy(nodeset);
goto cleanup;
}
+ /* setting nodeset when placement auto is invalid */
+ if (placement == VIR_DOMAIN_NUMATUNE_PLACEMENT_AUTO &&
+ numatune->memory.nodeset) {
+ virBitmapFree(numatune->memory.nodeset);
+ numatune->memory.nodeset = NULL;
+ }
+
if (placement != -1)
numatune->memory.placement = placement;
numatune->memory.specified = true;
ret = 0;
+
cleanup:
+ if (ret < 0 && created) {
+ virDomainNumatuneFree(*numatunePtr);
+ *numatunePtr = NULL;
+ }
+
return ret;
}
--- /dev/null
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='auto'>2</vcpu>
+ <numatune>
+ <memory mode='interleave' placement='static'/>
+ </numatune>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu>
+ <topology sockets='2' cores='1' threads='1'/>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
DO_TEST_PARSE_ERROR("numatune-memnodes-problematic", NONE);
DO_TEST("numad", NONE);
DO_TEST("numad-auto-vcpu-static-numatune", NONE);
+ DO_TEST_PARSE_ERROR("numad-auto-vcpu-static-numatune-no-nodeset", NONE);
DO_TEST("numad-auto-memory-vcpu-cpuset", NONE);
DO_TEST("numad-auto-memory-vcpu-no-cpuset-and-placement", NONE);
DO_TEST("numad-static-memory-auto-vcpu", NONE);