Commit 2bb6ba62 authored by Erik de Castro Lopo's avatar Erik de Castro Lopo

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
parent 29e14643
......@@ -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 --------------------------------------------------------------
......
......@@ -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) {
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment