From 8f3c4517b1fff965f2bdedcf376dcfd91cda422b Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 17 Aug 2023 15:20:55 +0200 Subject: [PATCH] libgomp: call numa_available first when using libnuma The documentation requires that numa_available() is called and only when successful, other libnuma function may be called. Internally, it does a syscall to get_mempolicy with flag=0 (which would return the default policy if mode were not NULL). If this returns -1 (and not 0) and errno == ENOSYS, the Linux kernel does not have the get_mempolicy syscall function; if so, numa_available() returns -1 (otherwise: 0). libgomp/ PR libgomp/111024 * allocator.c (gomp_init_libnuma): Call numa_available; if not available or not returning 0, disable libnuma usage. --- libgomp/allocator.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libgomp/allocator.c b/libgomp/allocator.c index 90f2dcb60d64..b4e50e2ad72a 100644 --- a/libgomp/allocator.c +++ b/libgomp/allocator.c @@ -118,6 +118,17 @@ gomp_init_libnuma (void) dlclose (handle); return; } + if (handle) + { + int (*numa_available) (void); + numa_available + = (__typeof (numa_available)) dlsym (handle, "numa_available"); + if (!numa_available || numa_available () != 0) + { + dlclose (handle); + handle = NULL; + } + } if (!handle) { __atomic_store_n (&libnuma_data, data, MEMMODEL_RELEASE); -- 2.47.2