From a3ff648f90c31cba2cc9e63fa93d61a310d33d95 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 4 Aug 2025 19:01:33 +0200 Subject: [PATCH 1/3] Call GC_allow_register_threads() to enable parallel marking in Boehm GC --- src/libexpr/eval-gc.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libexpr/eval-gc.cc b/src/libexpr/eval-gc.cc index 5a4ecf035..ce2bcae8a 100644 --- a/src/libexpr/eval-gc.cc +++ b/src/libexpr/eval-gc.cc @@ -53,6 +53,9 @@ static inline void initGCReal() GC_INIT(); + /* Enable parallel marking. */ + GC_allow_register_threads(); + /* Register valid displacements in case we are using alignment niches for storing the type information. This way tagged pointers are considered to be valid, even when they are not aligned. */ From 4c1c4f79a3286d76ec5f2e4746b89af009b55e46 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 4 Aug 2025 10:57:24 +0200 Subject: [PATCH 2/3] Move setting GC_THREADS into eval-gc.hh --- src/libexpr/eval-gc.cc | 2 -- src/libexpr/include/nix/expr/eval-gc.hh | 3 ++- src/libexpr/include/nix/expr/eval-inline.hh | 3 --- src/libexpr/meson.build | 2 -- 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/libexpr/eval-gc.cc b/src/libexpr/eval-gc.cc index ce2bcae8a..b17336a90 100644 --- a/src/libexpr/eval-gc.cc +++ b/src/libexpr/eval-gc.cc @@ -15,8 +15,6 @@ # include # endif -# include -# include # include # include diff --git a/src/libexpr/include/nix/expr/eval-gc.hh b/src/libexpr/include/nix/expr/eval-gc.hh index 25144d40c..813c2920d 100644 --- a/src/libexpr/include/nix/expr/eval-gc.hh +++ b/src/libexpr/include/nix/expr/eval-gc.hh @@ -3,12 +3,13 @@ #include -// For `NIX_USE_BOEHMGC`, and if that's set, `GC_THREADS` +// For `NIX_USE_BOEHMGC` #include "nix/expr/config.hh" #if NIX_USE_BOEHMGC # define GC_INCLUDE_NEW +# define GC_THREADS 1 # include # include diff --git a/src/libexpr/include/nix/expr/eval-inline.hh b/src/libexpr/include/nix/expr/eval-inline.hh index a1fd0ae4a..749e51537 100644 --- a/src/libexpr/include/nix/expr/eval-inline.hh +++ b/src/libexpr/include/nix/expr/eval-inline.hh @@ -6,9 +6,6 @@ #include "nix/expr/eval-error.hh" #include "nix/expr/eval-settings.hh" -// For `NIX_USE_BOEHMGC`, and if that's set, `GC_THREADS` -#include "nix/expr/config.hh" - namespace nix { /** diff --git a/src/libexpr/meson.build b/src/libexpr/meson.build index adf26008d..e1a12106d 100644 --- a/src/libexpr/meson.build +++ b/src/libexpr/meson.build @@ -61,8 +61,6 @@ if bdw_gc.found() define_value = cxx.has_function(funcspec).to_int() configdata_priv.set(define_name, define_value) endforeach - # Affects ABI, because it changes what bdw_gc itself does! - configdata_pub.set('GC_THREADS', 1) endif # Used in public header. Affects ABI! configdata_pub.set('NIX_USE_BOEHMGC', bdw_gc.found().to_int()) From 0d559f0c1301af9bd2c6751761bff6490962d0ee Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 4 Aug 2025 21:07:26 +0200 Subject: [PATCH 3/3] Increase the initial Boehm GC mark stack size If the mark stack size is too small, it greatly inhibits parallel marking, which is very bad for performance on multi-core systems. --- packaging/dependencies.nix | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packaging/dependencies.nix b/packaging/dependencies.nix index dda9ef8dc..17ba06b4d 100644 --- a/packaging/dependencies.nix +++ b/packaging/dependencies.nix @@ -50,9 +50,19 @@ scope: { requiredSystemFeatures = [ ]; }; - boehmgc = pkgs.boehmgc.override { - enableLargeConfig = true; - }; + boehmgc = + (pkgs.boehmgc.override { + enableLargeConfig = true; + }).overrideAttrs + (attrs: { + # Increase the initial mark stack size to avoid stack + # overflows, since these inhibit parallel marking (see + # GC_mark_some()). To check whether the mark stack is too + # small, run Nix with GC_PRINT_STATS=1 and look for messages + # such as `Mark stack overflow`, `No room to copy back mark + # stack`, and `Grew mark stack to ... frames`. + NIX_CFLAGS_COMPILE = "-DINITIAL_MARK_STACK_SIZE=1048576"; + }); # TODO Hack until https://github.com/NixOS/nixpkgs/issues/45462 is fixed. boost =