[libvirt] [PATCH 2/2] util: numa: Stub out hugepage code on non-Linux platforms

Michal Privoznik mprivozn at redhat.com
Mon Jun 23 11:49:37 UTC 2014


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




More information about the libvir-list mailing list