
On 10/16/2015 08:11 AM, Peter Krempa wrote:
Make the function usable so that -1 can be passed to it as cell ID so that we can later enable memory hotplug on non-NUMA guests for certain architectures.
I've inspected all functions that take guestNode as an argument to verify that they are eiter safe to be called or are not called at all.
either Although it seems that comment is left for under the --- ...
--- src/qemu/qemu_command.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f727d0b..a37a4fa 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5011,7 +5011,8 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, * qemuBuildMemoryBackendStr: * @size: size of the memory device in kibibytes * @pagesize: size of the requested memory page in KiB, 0 for default - * @guestNode: NUMA node in the guest that the memory object will be attached to + * @guestNode: NUMA node in the guest that the memory object will be attached + * to, or -1 if NUMA is not used in the guest * @hostNodes: map of host nodes to alloc the memory in, NULL for default * @autoNodeset: fallback nodeset in case of automatic numa placement * @def: domain definition object @@ -5058,7 +5059,8 @@ qemuBuildMemoryBackendStr(unsigned long long size, *backendType = NULL;
/* memory devices could provide a invalid guest node */ - if (guestNode >= virDomainNumaGetNodeCount(def->numa)) { + if (guestNode >= 0 && + guestNode >= virDomainNumaGetNodeCount(def->numa)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("can't add memory backend for guest node '%d' as " "the guest has only '%zu' NUMA nodes configured"), @@ -5069,7 +5071,9 @@ qemuBuildMemoryBackendStr(unsigned long long size, if (!(props = virJSONValueNewObject())) return -1;
^^ this could move
- memAccess = virDomainNumaGetNodeMemoryAccessMode(def->numa, guestNode); + if (guestNode >= 0) + memAccess = virDomainNumaGetNodeMemoryAccessMode(def->numa, guestNode); + if (virDomainNumatuneGetMode(def->numa, guestNode, &mode) < 0 && virDomainNumatuneGetMode(def->numa, -1, &mode) < 0) mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
^^ Seems to me the code could be adjusted a bit to have: if (guestNode >= 0) { if (guestNode >= virDomainNumaGetNodeCount(def->numa)) ... memAccess = virDomainNumaGetNodeMemoryAccessMode(def->numa, guestNode); ... if (virDomainNumatuneGetMode(def->numa, guestNode, &mode) < 0 && ... } where 'mode' is initialized to VIR_DOMAIN_NUMATUNE_MEM_STRICT; and the props call moves either before or after the blob.
@@ -5086,6 +5090,10 @@ qemuBuildMemoryBackendStr(unsigned long long size, continue; }
+ /* just find the master hugepage in case we don't use NUMA */ + if (guestNode < 0) + continue; +
So what you're say is if master_hugepage is set/found, then we don't need to find anything else? Or can there be more than one master_hugepage and it is desired to find the "last"? Is there perhaps a cause/reason to break the loop rather than continue? IOW: Move the check inside the previous if and use it as a cause to break the loop. I think this is ACK-able with a couple of adjustments, but just wanted to check what was more reasonable first - especially with this < 0 change. John
if (virBitmapGetBit(hugepage->nodemask, guestNode, &thisHugepage) < 0) { /* Ignore this error. It's not an error after all. Well,