From 63443383e9f73df375dd2734986bfc758955ddc7 Mon Sep 17 00:00:00 2001 From: Yoshihisa Morizumi Date: Fri, 29 Jan 2021 05:17:47 +0900 Subject: [PATCH] xpmem: truncates the size of xpmem_attach at the page boundary (workaround for fjmpi) Fujitsu MPI tries to attach a segment with the size of the source range size plus one. Change-Id: Iab3801727f938dfb6242b6b90c88e4986b84d08e Refs: #1507 --- CMakeLists.txt | 18 ++++++++++++++++++ kernel/xpmem.c | 9 +++++++++ 2 files changed, 27 insertions(+) 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))