diff --git a/config/opal_check_cma.m4 b/config/opal_check_cma.m4 index 8ae5797dcf4..2930debf911 100644 --- a/config/opal_check_cma.m4 +++ b/config/opal_check_cma.m4 @@ -18,23 +18,45 @@ # -------------------------------------------------------- # check if cma support is wanted. AC_DEFUN([OPAL_CHECK_CMA],[ - if test -z "$ompi_check_cma_happy" ; then - OPAL_VAR_SCOPE_PUSH([ompi_check_cma_need_defs ompi_check_cma_kernel_version ompi_check_cma_CFLAGS]) - - AC_ARG_WITH([cma], - [AC_HELP_STRING([--with-cma], - [Build Cross Memory Attach support (default: autodetect)])]) - - # Enable CMA support by default if process_vm_readv is defined in glibc - AC_CHECK_FUNC(process_vm_readv, [ompi_check_cma_need_defs=0], - [ompi_check_cma_need_defs=1]) - - if test $ompi_check_cma_need_defs = 1 ; then - ompi_check_cma_CFLAGS="$CFLAGS" - # Need some extra include paths to locate the appropriate headers - CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/opal/include" - AC_MSG_CHECKING([if internal syscall numbers for Linux CMA work]) - AC_RUN_IFELSE([AC_LANG_PROGRAM([[ + AC_ARG_WITH([cma], + [AC_HELP_STRING([--with-cma], + [Build Cross Memory Attach support (default: autodetect)])]) + + # We only need to do the back-end test once + if test -z "$opal_check_cma_happy" ; then + OPAL_CHECK_CMA_BACKEND + fi + + AS_IF([test $opal_check_cma_happy -eq 1], + [$2], + [if test "$with_cma" = "yes"; then + AC_MSG_WARN([--with-cma support requested, but not available]) + AC_MSG_ERROR([Cannot continue]) + fi + $3]) +]) + +AC_DEFUN([OPAL_CHECK_CMA_BACKEND], +[ + OPAL_VAR_SCOPE_PUSH([opal_check_cma_need_defs opal_check_cma_kernel_version opal_check_cma_CFLAGS opal_check_cma_msg]) + + # Some systems have process_cm_readv() in libc, which means CMA is + # supported. Other systems do not have process_cm_readv() in + # libc, but have support for it in the kernel if we invoke it + # directly. Check for both. + AC_CHECK_HEADERS([sys/prctl.h]) + + AC_CHECK_FUNC([process_vm_readv], [opal_check_cma_need_defs=0], + [opal_check_cma_need_defs=1]) + AC_DEFINE_UNQUOTED([OPAL_CMA_NEED_SYSCALL_DEFS], + [$opal_check_cma_need_defs], + [Need CMA syscalls defined]) + if test $opal_check_cma_need_defs -eq 1 ; then + opal_check_cma_CFLAGS=$CFLAGS + # Need some extra include paths to locate the appropriate headers + CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/opal/include" + AC_MSG_CHECKING([if internal syscall numbers for Linux CMA work]) + AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #include @@ -88,31 +110,23 @@ static void do_check (pid_t pid, int *in, int *out) /* all good */ return 0; ]])], - [AC_MSG_RESULT([yes]) - ompi_check_cma_happy="yes"], - [AC_MSG_RESULT([no]) - ompi_check_cma_happy="no"], - [AC_MSG_RESULT([no (cross-compiling)]) - ompi_check_cma_happy="no"]) - CFLAGS="$ompi_check_cma_CFLAGS" - else - ompi_check_cma_happy="yes" - fi - - # If the user specifically requests CMA go ahead and enable it even - # if the glibc version does not support process_vm_readv - if test "x$with_cma" = "xyes" || test "$ompi_check_cma_happy" = "yes" ; then - ompi_check_cma_happy="yes" - AC_DEFINE_UNQUOTED([OPAL_CMA_NEED_SYSCALL_DEFS], - [$ompi_check_cma_need_defs], - [Need CMA syscalls defined]) - AC_CHECK_HEADERS([sys/prctl.h]) - fi - - OPAL_VAR_SCOPE_POP - - OPAL_SUMMARY_ADD([[Transports]],[[Shared memory/Linux CMA]],[$1],[$ompi_check_cma_happy]) + [AC_MSG_RESULT([yes]) + opal_check_cma_happy=1], + [AC_MSG_RESULT([no]) + opal_check_cma_happy=0], + [AC_MSG_RESULT([no (cross-compiling)]) + opal_check_cma_happy=0]) + CFLAGS=$opal_check_cma_CFLAGS + else + # If we didn't need the defs, then we have process_vm_readv(), + # and CMA is happy. + opal_check_cma_happy=1 fi - AS_IF([test "$ompi_check_cma_happy" = "yes"], [$2], [$3]) + OPAL_VAR_SCOPE_POP + + AS_IF([test $opal_check_cma_happy -eq 1], + [opal_check_cma_msg=yes], + [opal_check_cma_msg=no]) + OPAL_SUMMARY_ADD([[Transports]],[[Shared memory/Linux CMA]],[$1],[$opal_check_cma_msg]) ])