On 23.06.2014 09:29, Peter Krempa wrote:
The hugepage sizing and counting code gathers the information from sysfs and thus isn't portable. Stub it out for non-Linux so that we can report a better error. This patch also avoids calling sysinfo() on Mingw where it isn't supported. --- src/util/virnuma.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/util/virnuma.c b/src/util/virnuma.c index 9cf5a75..9cf9686 100644 --- a/src/util/virnuma.c +++ b/src/util/virnuma.c @@ -512,9 +512,12 @@ virNumaGetDistances(int node ATTRIBUTE_UNUSED, #endif -#define HUGEPAGES_NUMA_PREFIX "/sys/devices/system/node/" -#define HUGEPAGES_SYSTEM_PREFIX "/sys/kernel/mm/hugepages/" -#define HUGEPAGES_PREFIX "hugepages-" +/* currently all the hugepage stuff below is linux only */ +#if WITH_LINUX + +# define HUGEPAGES_NUMA_PREFIX "/sys/devices/system/node/" +# define HUGEPAGES_SYSTEM_PREFIX "/sys/kernel/mm/hugepages/" +# define HUGEPAGES_PREFIX "hugepages-" static int virNumaGetHugePageInfoPath(char **path, @@ -663,7 +666,7 @@ virNumaGetPageInfo(int node, /* sysconf() returns page size in bytes, * the @page_size is however in kibibytes */ if (page_size == system_page_size / 1024) { -#if 0 +# if 0 unsigned long long memsize, memfree; /* TODO: come up with better algorithm that takes huge pages into @@ -681,11 +684,11 @@ virNumaGetPageInfo(int node, if (page_free) *page_free = memfree / system_page_size; -#else +# else virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", _("system page size are not supported yet")); goto cleanup; -#endif /* 0 */ +# endif /* 0 */ } else { if (virNumaGetHugePageInfo(node, page_size, page_avail, page_free) < 0) goto cleanup; @@ -735,7 +738,7 @@ virNumaGetPages(int node, size_t i; bool exchange; -#if 0 +# if 0 /* This has to be disabled until the time the issue in * virNumaGetPageInfo is resolved. Sorry. */ long system_page_size; @@ -756,7 +759,7 @@ virNumaGetPages(int node, goto cleanup; tmp_size[ntmp] = system_page_size; ntmp++; -#endif /* 0 */ +# endif /* 0 */ /* Now that we got ordinary system pages, lets get info on huge pages */ if (virNumaGetHugePageInfoPath(&path, node, 0, NULL) < 0) @@ -844,3 +847,30 @@ virNumaGetPages(int node, VIR_FREE(path); return ret;
Up till here everything's okay. But ...
} + + +#else /* #if WITH_LINUX */ +int +virNumaGetPageInfo(int node ATTRIBUTE_UNUSED, + unsigned int page_size ATTRIBUTE_UNUSED, + unsigned int *page_avail ATTRIBUTE_UNUSED, + unsigned int *page_free ATTRIBUTE_UNUSED) +{ + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _("system page size are not supported for this platform")); + return -1; +} + + +int +virNumaGetPages(int node ATTRIBUTE_UNUSED, + unsigned int **pages_size ATTRIBUTE_UNUSED, + unsigned int **pages_avail ATTRIBUTE_UNUSED, + unsigned int **pages_free ATTRIBUTE_UNUSED, + size_t *npages ATTRIBUTE_UNUSED) +{ + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _("system page size are not supported for this platform")); + return -1; +} +#endif /* #if WITH_LINUX */
These two APIs are intended to get info for all page sizes, not only the ordinary system ones.
ACK with the error message changed to reflect that. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list