diff --git a/CMakeLists.txt b/CMakeLists.txt index 04f6aad0..f2c20519 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,6 +83,23 @@ if(ENABLE_FUGAKU_HACKS) set(KBUILD_C_FLAGS "${KBUILD_C_FLAGS} -DENABLE_FUGAKU_HACKS") endif() +# Fujitsu MPI tries to xpmem-attach segment with size of range size + 1? +set(FJMPI_VERSION_COMMAND "a=\$(which mpifcc); b=\${a%/*/*}; c=\${b##*/}; d=\${c#*-}; echo \$d") +execute_process(COMMAND bash -c "${FJMPI_VERSION_COMMAND}" + OUTPUT_VARIABLE FJMPI_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) +message("FJMPI_VERSION: ${FJMPI_VERSION}") + +if(NOT "${FJMPI_VERSION}" STREQUAL "") + option(ENABLE_FJMPI_WORKAROUND "Fujitsu MPI workaround" ON) +else() + option(ENABLE_FJMPI_WORKAROUND "Fujitsu MPI workaround" OFF) +endif() + +if(ENABLE_FJMPI_WORKAROUND) + add_definitions(-DENABLE_FJMPI_WORKAROUND) + set(KBUILD_C_FLAGS "${KBUILD_C_FLAGS} -DENABLE_FJMPI_WORKAROUND") +endif() + # krm that mandates reserved memory amount >= available at boot time? execute_process(COMMAND bash -c "rpm -qi FJSVpxkrm-plugin-mckernel | awk '$1 == \"Version\" && $2 == \":\" { print $3 }'" OUTPUT_VARIABLE KRM_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -315,6 +332,7 @@ message("ENABLE_TOFU: ${ENABLE_TOFU}") message("ENABLE_FUGAKU_HACKS: ${ENABLE_FUGAKU_HACKS}") message("ENABLE_FUGAKU_DEBUG: ${ENABLE_FUGAKU_DEBUG}") message("ENABLE_KRM_WORKAROUND: ${ENABLE_KRM_WORKAROUND}") +message("ENABLE_FJMPI_WORKAROUND: ${ENABLE_FJMPI_WORKAROUND}") message("PROFILE_ENABLE: ${PROFILE_ENABLE}") message("ENABLE_RUSAGE: ${ENABLE_RUSAGE}") message("ENABLE_QLMPI: ${ENABLE_QLMPI}") diff --git a/kernel/xpmem.c b/kernel/xpmem.c index 3a3525b0..4bde18d3 100644 --- a/kernel/xpmem.c +++ b/kernel/xpmem.c @@ -1027,10 +1027,19 @@ static int xpmem_attach( return -EINVAL; } +#ifdef ENABLE_FJMPI_WORKAROUND + /* Truncate size at page boundary because Fujitsu MPI + * erroneously passes (source range size + 1) as "size" + */ + size = (size & ~(PAGE_SIZE - 1)); +#else /* If the size is not page aligned, fix it */ if (offset_in_page(size) != 0) { size += PAGE_SIZE - offset_in_page(size); } +#endif + + XPMEM_DEBUG("size after fix: 0x%lx", size); ap_tg = xpmem_tg_ref_by_apid(apid); if (IS_ERR(ap_tg))