summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2025-12-16 04:54:03 +0000
committerSam James <sam@gentoo.org>2025-12-16 04:56:32 +0000
commit961b92133cc9353908d0d58d5bc8ba6d2959d9d6 (patch)
treeac51165ac0527f2f9f8becef599c85b330a0d850
parent3fcf7df038b45c5ca9b570ec00a09f434a8294d9 (diff)
downloadgentoo-961b92133cc9353908d0d58d5bc8ba6d2959d9d6.tar.gz
gentoo-961b92133cc9353908d0d58d5bc8ba6d2959d9d6.tar.bz2
gentoo-961b92133cc9353908d0d58d5bc8ba6d2959d9d6.zip
sci-libs/openblas: fix memory allocation issues
* Backport upstream fix to not spin in blas_memory_alloc on ENOMEM (bug #967251). Combined with the high defaults for NUM_PARALLEL and NUM_THREADS set by the ebuild, flexiblas configure would hang. * Choose lower values for NUM_PARALLEL, NUM_THREADS on 32-bit arches (bug #967251). * Document the current issue w/ overcommit (bug #967026). Thank you to Anon Emuss for the detailed bug report and analysis. Bug: https://bugs.gentoo.org/967026 Closes: https://bugs.gentoo.org/967251 Tested-by: Eli Schwartz <eschwartz@gentoo.org> Signed-off-by: Sam James <sam@gentoo.org>
-rw-r--r--sci-libs/openblas/files/openblas-0.3.30-enomem-check.patch46
-rw-r--r--sci-libs/openblas/openblas-0.3.30-r5.ebuild (renamed from sci-libs/openblas/openblas-0.3.30-r4.ebuild)26
2 files changed, 71 insertions, 1 deletions
diff --git a/sci-libs/openblas/files/openblas-0.3.30-enomem-check.patch b/sci-libs/openblas/files/openblas-0.3.30-enomem-check.patch
new file mode 100644
index 000000000000..bf2e1d4035a8
--- /dev/null
+++ b/sci-libs/openblas/files/openblas-0.3.30-enomem-check.patch
@@ -0,0 +1,46 @@
+https://bugs.gentoo.org/967251
+https://github.com/OpenMathLib/OpenBLAS/issues/5289
+https://github.com/OpenMathLib/OpenBLAS/pull/5303
+
+From 31ef2cbbb353c1331a22ed4f909a6ffb5cc45b45 Mon Sep 17 00:00:00 2001
+From: Martin Kroeker <martin@ruby.chemie.uni-freiburg.de>
+Date: Fri, 13 Jun 2025 14:11:03 +0200
+Subject: [PATCH] Exit if memory allocation keeps failing, instead of looping
+ forever
+
+---
+ driver/others/memory.c | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/driver/others/memory.c b/driver/others/memory.c
+index c53e798bc1..c8415f348e 100644
+--- a/driver/others/memory.c
++++ b/driver/others/memory.c
+@@ -2922,6 +2922,7 @@ void *blas_memory_alloc(int procpos){
+ blas_unlock(&memory[position].lock);
+ #endif
+ if (!memory[position].addr) {
++ int failcount = 0;
+ do {
+ #ifdef DEBUG
+ printf("Allocation Start : %lx\n", base_address);
+@@ -2973,8 +2974,16 @@ void *blas_memory_alloc(int procpos){
+ #ifdef DEBUG
+ printf(" Success -> %08lx\n", map_address);
+ #endif
+- if (((BLASLONG) map_address) == -1) base_address = 0UL;
+-
++ if (((BLASLONG) map_address) == -1) {
++ base_address = 0UL;
++ failcount++;
++ if (failcount >10) {
++ fprintf(stderr, "OpenBLAS error: Memory allocation still failed after 10 retries, giving up.\n");
++ exit(1);
++ }
++ } else {
++ failcount = 0;
++ }
+ if (base_address) base_address += BUFFER_SIZE + FIXED_PAGESIZE;
+
+ } while ((BLASLONG)map_address == -1);
+
diff --git a/sci-libs/openblas/openblas-0.3.30-r4.ebuild b/sci-libs/openblas/openblas-0.3.30-r5.ebuild
index c6c72fa54cb9..ec3f26c2ff3a 100644
--- a/sci-libs/openblas/openblas-0.3.30-r4.ebuild
+++ b/sci-libs/openblas/openblas-0.3.30-r5.ebuild
@@ -36,6 +36,8 @@ PATCHES=(
"${FILESDIR}/${P}-lunar-lake.patch"
# https://github.com/OpenMathLib/OpenBLAS/pull/5360
"${FILESDIR}/${P}-arm-assembly.patch"
+ # https://github.com/OpenMathLib/OpenBLAS/pull/5303
+ "${FILESDIR}/${P}-enomem-check.patch"
)
pkg_pretend() {
@@ -109,7 +111,29 @@ src_configure() {
export DYNAMIC_ARCH=1 NO_AFFINITY=1 TARGET=GENERIC
fi
- export NUM_PARALLEL=${OPENBLAS_NPARALLEL:-8} NUM_THREADS=${OPENBLAS_NTHREAD:-64}
+ case $(tc-get-ptr-size) in
+ 4)
+ # NUM_BUFFERS = MAX(50, (2*NUM_PARALLEL*NUM_THREADS)
+ # BUFFER_SIZE = (16 << 20) (on x86)
+ # NUM_BUFFERS * BUFFER_SIZE is allocated and must be
+ # <4GiB on 32-bit arches (bug #967251).
+ #
+ # Scale down to 2*8*(16 << 20) = 256MiB for 32-bit
+ # arches. This avoids spinning in blas_memory_alloc
+ # which doesn't handle ENOMEM.
+ export NUM_PARALLEL=${OPENBLAS_NPARALLEL:-2}
+ export NUM_THREADS=${OPENBLAS_NTHREAD:-8}
+ ;;
+ 8)
+ # XXX: The current values here rely on overcommit
+ # for most systems (bug #967026).
+ export NUM_PARALLEL=${OPENBLAS_NPARALLEL:-8}
+ export NUM_THREADS=${OPENBLAS_NTHREAD:-64}
+ ;;
+ *)
+ die "Unexpected tc-get-ptr-size. Please file a bug."
+ ;;
+ esac
# Allow setting OPENBLAS_TARGET to override auto detection in case the
# toolchain is not enough to detect.