aboutsummaryrefslogtreecommitdiff
path: root/libgomp/allocator.c
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2023-08-17 15:20:55 +0200
committerTobias Burnus <tobias@codesourcery.com>2023-08-17 15:20:55 +0200
commit8f3c4517b1fff965f2bdedcf376dcfd91cda422b (patch)
tree139c56f37270a56083052602196221be698c5ee3 /libgomp/allocator.c
parent84a5be47f8e13839efdf0e06f02ef1a0cacf5e34 (diff)
downloadgcc-8f3c4517b1fff965f2bdedcf376dcfd91cda422b.zip
gcc-8f3c4517b1fff965f2bdedcf376dcfd91cda422b.tar.gz
gcc-8f3c4517b1fff965f2bdedcf376dcfd91cda422b.tar.bz2
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.
Diffstat (limited to 'libgomp/allocator.c')
-rw-r--r--libgomp/allocator.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/libgomp/allocator.c b/libgomp/allocator.c
index 90f2dcb..b4e50e2 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);