Name it virNumaGetHostMemoryNodeset and return only NUMA nodes which
have memory installed. This is necessary as the kernel is not very happy
to set the memory cgroup setting for nodes which do not have any memory.
This would break vcpu hotplug with following message on such
configruation:
Invalid value '0,8' for 'cpuset.mems': Invalid argument
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=
1375268
# util/virnuma.h
virNumaGetAutoPlacementAdvice;
virNumaGetDistances;
-virNumaGetHostNodeset;
+virNumaGetHostMemoryNodeset;
virNumaGetMaxNode;
virNumaGetNodeMemory;
virNumaGetPageInfo;
virBitmapPtr all_nodes;
virCgroupPtr cgroup_temp = NULL;
- if (!(all_nodes = virNumaGetHostNodeset()))
+ if (!(all_nodes = virNumaGetHostMemoryNodeset()))
goto error;
if (!(mem_mask = virBitmapFormat(all_nodes)))
!virCgroupHasController(cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
return 0;
- if (!(all_nodes = virNumaGetHostNodeset()))
+ if (!(all_nodes = virNumaGetHostMemoryNodeset()))
goto cleanup;
if (!(all_nodes_str = virBitmapFormat(all_nodes)))
return true;
}
+
+/**
+ * virNumaGetHostMemoryNodeset:
+ *
+ * Returns a bitmap of guest numa node ids that contain memory.
+ */
virBitmapPtr
-virNumaGetHostNodeset(void)
+virNumaGetHostMemoryNodeset(void)
{
int maxnode = virNumaGetMaxNode();
+ unsigned long long nodesize;
size_t i = 0;
virBitmapPtr nodeset = NULL;
if (!virNumaNodeIsAvailable(i))
continue;
- ignore_value(virBitmapSetBit(nodeset, i));
+ /* if we can't detect NUMA node size assume that it's present */
+ if (virNumaGetNodeMemory(i, &nodesize, NULL) < 0 || nodesize > 0)
+ ignore_value(virBitmapSetBit(nodeset, i));
}
return nodeset;
int virNumaSetupMemoryPolicy(virDomainNumatuneMemMode mode,
virBitmapPtr nodeset);
-virBitmapPtr virNumaGetHostNodeset(void);
+virBitmapPtr virNumaGetHostMemoryNodeset(void);
bool virNumaNodesetIsAvailable(virBitmapPtr nodeset);
bool virNumaIsAvailable(void);
int virNumaGetMaxNode(void);