static long getrampagesize(void)
{
long hpsize = LONG_MAX;
+ long mainrampagesize;
Object *memdev_root;
if (mem_path) {
- return gethugepagesize(mem_path);
+ mainrampagesize = gethugepagesize(mem_path);
+ } else {
+ mainrampagesize = getpagesize();
}
/* it's possible we have memory-backend objects with
* backend isn't backed by hugepages.
*/
memdev_root = object_resolve_path("/objects", NULL);
- if (!memdev_root) {
- return getpagesize();
+ if (memdev_root) {
+ object_child_foreach(memdev_root, find_max_supported_pagesize, &hpsize);
}
-
- object_child_foreach(memdev_root, find_max_supported_pagesize, &hpsize);
-
- if (hpsize == LONG_MAX || hpsize == getpagesize()) {
- return getpagesize();
+ if (hpsize == LONG_MAX) {
+ /* No additional memory regions found ==> Report main RAM page size */
+ return mainrampagesize;
}
/* If NUMA is disabled or the NUMA nodes are not backed with a
- * memory-backend, then there is at least one node using "normal"
- * RAM. And since normal RAM has not been configured with "-mem-path"
- * (what we've checked earlier here already), we can not use huge pages!
+ * memory-backend, then there is at least one node using "normal" RAM,
+ * so if its page size is smaller we have got to report that size instead.
*/
- if (nb_numa_nodes == 0 || numa_info[0].node_memdev == NULL) {
+ if (hpsize > mainrampagesize &&
+ (nb_numa_nodes == 0 || numa_info[0].node_memdev == NULL)) {
static bool warned;
if (!warned) {
error_report("Huge page support disabled (n/a for main memory).");
warned = true;
}
- return getpagesize();
+ return mainrampagesize;
}
return hpsize;