summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik de Castro Lopo <erikd@mega-nerd.com>2016-06-13 19:24:18 +1000
committerErik de Castro Lopo <erikd@mega-nerd.com>2016-06-13 19:24:19 +1000
commit2bb6ba62b8d0e9c79b59e39e225758cf999eff83 (patch)
treea4ca5693274b43dc0e6250c71028406c42343d02
parent29e1464319f40fe30fd63d8648f0d0a05541abe0 (diff)
downloadhaskell-2bb6ba62b8d0e9c79b59e39e225758cf999eff83.tar.gz
rts: Fix NUMA when cross compiling
The NUMA code was enabled whenever numa.h and numaif.h are detected. Unfortunately, the hosts' header files were being detected even then cross compiling in the absence of a target libnuma. Fix that by relying on the the presence of libnuma instead of the presence of the header files. The test for libnuma does `AC_TRY_LINK` which will fail if the test program (compiled for the target) can't be linked against libnuma. Test Plan: Build on x86_64/linux and make sure NUMA works and cross compile to armhf/linux. Reviewers: austin, bgamari, hvr, simonmar Reviewed By: simonmar Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D2329
-rw-r--r--configure.ac9
-rw-r--r--rts/posix/OSMem.c8
-rw-r--r--rts/posix/OSThreads.c2
3 files changed, 11 insertions, 8 deletions
diff --git a/configure.ac b/configure.ac
index 070bae54d9..664deb4de6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1105,10 +1105,13 @@ AC_DEFINE_UNQUOTED([USE_LIBDW], [$USE_LIBDW], [Set to 1 to use libdw])
dnl ** Have libnuma?
dnl --------------------------------------------------------------
+HaveLibNuma=0
AC_CHECK_HEADERS([numa.h numaif.h])
-AC_CHECK_LIB(numa, numa_available,
- [AC_DEFINE([HAVE_LIBNUMA], [1], [Define to 1 if you have libnuma.])]
- [])
+
+if test "$ac_cv_header_numa_h$ac_cv_header_numaif_h" = "yesyes" ; then
+ AC_CHECK_LIB(numa, numa_available,HaveLibNuma=1)
+fi
+AC_DEFINE_UNQUOTED([USE_LIBNUMA], [$HaveLibNuma], [Define to 1 if you have libnuma])
dnl ** Documentation
dnl --------------------------------------------------------------
diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c
index 58310fe0ea..99620ee31e 100644
--- a/rts/posix/OSMem.c
+++ b/rts/posix/OSMem.c
@@ -306,7 +306,7 @@ void osBindMBlocksToNode(
StgWord size STG_UNUSED,
uint32_t node STG_UNUSED)
{
-#ifdef HAVE_NUMAIF_H
+#if HAVE_LIBNUMA
int ret;
StgWord mask = 0;
mask |= 1 << node;
@@ -548,7 +548,7 @@ void osReleaseHeapMemory(void)
rtsBool osNumaAvailable(void)
{
-#ifdef HAVE_NUMA_H
+#if HAVE_LIBNUMA
return (numa_available() != -1);
#else
return rtsFalse;
@@ -557,7 +557,7 @@ rtsBool osNumaAvailable(void)
uint32_t osNumaNodes(void)
{
-#ifdef HAVE_NUMA_H
+#if HAVE_LIBNUMA
return numa_num_configured_nodes();
#else
return 1;
@@ -566,7 +566,7 @@ uint32_t osNumaNodes(void)
StgWord osNumaMask(void)
{
-#ifdef HAVE_NUMA_H
+#if HAVE_LIBNUMA
struct bitmask *mask;
mask = numa_get_mems_allowed();
if (mask->size > sizeof(StgWord)*8) {
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
index 72538c1bf3..35ea2bde21 100644
--- a/rts/posix/OSThreads.c
+++ b/rts/posix/OSThreads.c
@@ -318,7 +318,7 @@ setThreadAffinity (uint32_t n STG_UNUSED,
}
#endif
-#ifdef HAVE_NUMA_H
+#if HAVE_LIBNUMA
void setThreadNode (uint32_t node)
{
ASSERT(node < RtsFlags.GcFlags.nNumaNodes);