From 96a96a0bc4236bdc657db060b014db6d52b7d712 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 12 May 2025 19:06:04 -0400 Subject: [PATCH] Move CPU optimizations into their own role. This is remove duplication between the individual hosts folders. --- nix/configuration/configuration.nix | 11 ++ nix/configuration/hosts/hydra/default.nix | 17 +- .../hosts/hydra/optimized_build.nix | 73 --------- .../hosts/ionlybootzfs/default.nix | 18 ++- nix/configuration/hosts/neelix/default.nix | 16 +- .../hosts/neelix/optimized_build.nix | 80 ---------- nix/configuration/hosts/odo/default.nix | 18 ++- .../hosts/odo/optimized_build.nix | 131 ---------------- nix/configuration/hosts/quark/default.nix | 19 ++- .../hosts/quark/optimized_build.nix | 134 ---------------- .../roles/global_options/default.nix | 9 -- .../roles/optimized_build/default.nix | 147 ++++++++++++++++++ 12 files changed, 237 insertions(+), 436 deletions(-) delete mode 100644 nix/configuration/hosts/hydra/optimized_build.nix delete mode 100644 nix/configuration/hosts/neelix/optimized_build.nix delete mode 100644 nix/configuration/hosts/odo/optimized_build.nix delete mode 100644 nix/configuration/hosts/quark/optimized_build.nix create mode 100644 nix/configuration/roles/optimized_build/default.nix diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 08e27fe..f621663 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -44,6 +44,7 @@ ./roles/nix_index ./roles/nix_worker ./roles/nvme + ./roles/optimized_build ./roles/pcsx2 ./roles/python ./roles/qemu @@ -84,6 +85,16 @@ # Use nixos-rebuild-ng # system.rebuild.enableNg = true; + # Keep outputs so we can build offline. + nix.extraOptions = '' + keep-outputs = true + keep-derivations = true + ''; + + # Technically only needed when building the ISO because nix detects ZFS in the filesystem list normally. I basically always want this so I'm just setting it to always be on. + boot.supportedFilesystems.zfs = true; + # TODO: Is this different from boot.supportedFilesystems = [ "zfs" ]; ? + services.getty = { autologinUser = "talexander"; # I use full disk encryption so the user password is irrelevant. autologinOnce = true; diff --git a/nix/configuration/hosts/hydra/default.nix b/nix/configuration/hosts/hydra/default.nix index f330dc4..cb4dd65 100644 --- a/nix/configuration/hosts/hydra/default.nix +++ b/nix/configuration/hosts/hydra/default.nix @@ -36,9 +36,24 @@ time.timeZone = "America/New_York"; i18n.defaultLocale = "en_US.UTF-8"; - me.optimizations.enable = true; me.secureBoot.enable = false; + me.optimizations = { + enable = true; + arch = "znver4"; + system_features = [ + "gccarch-znver4" + "gccarch-skylake" + # "gccarch-alderlake" missing WAITPKG + "gccarch-x86-64-v3" + "gccarch-x86-64-v4" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + }; + # Mount tmpfs at /tmp boot.tmp.useTmpfs = true; diff --git a/nix/configuration/hosts/hydra/optimized_build.nix b/nix/configuration/hosts/hydra/optimized_build.nix deleted file mode 100644 index 097c834..0000000 --- a/nix/configuration/hosts/hydra/optimized_build.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -{ - imports = [ ]; - - config = lib.mkMerge [ - { - nix.settings.system-features = lib.mkForce [ - "gccarch-znver4" - "gccarch-x86-64-v3" - "gccarch-x86-64-v4" - "benchmark" - "big-parallel" - # "kvm" - # "nixos-test" - ]; - - nixpkgs.hostPlatform = { - gcc.arch = "znver4"; - gcc.tune = "znver4"; - system = "x86_64-linux"; - }; - - nixpkgs.overlays = [ - ( - final: prev: - let - optimizeWithFlags = - pkg: flags: - pkg.overrideAttrs (old: { - NIX_CFLAGS_COMPILE = [ (old.NIX_CFLAGS_COMPILE or "") ] ++ flags; - }); - addConfig = - additionalConfig: pkg: - pkg.override (oldconfig: { - structuredExtraConfig = pkg.structuredExtraConfig // additionalConfig; - }); - in - { - linux_znver4 = - addConfig - { - # Full preemption - PREEMPT = lib.mkOverride 60 lib.kernel.yes; - PREEMPT_VOLUNTARY = lib.mkOverride 60 lib.kernel.no; - - # Google's BBRv3 TCP congestion Control - TCP_CONG_BBR = lib.kernel.yes; - DEFAULT_BBR = lib.kernel.yes; - - # Preemptive Full Tickless Kernel at 300Hz - HZ = lib.kernel.freeform "300"; - HZ_300 = lib.kernel.yes; - HZ_1000 = lib.kernel.no; - } - ( - optimizeWithFlags prev.linux_6_14 [ - "-march=znver4" - "-mtune=znver4" - ] - ); - } - ) - ]; - - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_znver4; - } - ]; -} diff --git a/nix/configuration/hosts/ionlybootzfs/default.nix b/nix/configuration/hosts/ionlybootzfs/default.nix index 33aafa8..e0aa9eb 100644 --- a/nix/configuration/hosts/ionlybootzfs/default.nix +++ b/nix/configuration/hosts/ionlybootzfs/default.nix @@ -24,7 +24,6 @@ imports = [ ./wrapped-disk-config.nix ./hardware-configuration.nix - ./optimized_build.nix ]; # Generate with `head -c4 /dev/urandom | od -A none -t x4` @@ -35,9 +34,24 @@ time.timeZone = "America/New_York"; i18n.defaultLocale = "en_US.UTF-8"; - me.optimizations.enable = false; me.secureBoot.enable = true; + me.optimizations = { + enable = false; + arch = "znver4"; + system_features = [ + "gccarch-znver4" + "gccarch-skylake" + # "gccarch-alderlake" missing WAITPKG + "gccarch-x86-64-v3" + "gccarch-x86-64-v4" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + }; + # Mount tmpfs at /tmp boot.tmp.useTmpfs = true; diff --git a/nix/configuration/hosts/neelix/default.nix b/nix/configuration/hosts/neelix/default.nix index e2fcba8..ee2dc78 100644 --- a/nix/configuration/hosts/neelix/default.nix +++ b/nix/configuration/hosts/neelix/default.nix @@ -3,7 +3,6 @@ imports = [ ./hardware-configuration.nix ./disk-config.nix - ./optimized_build.nix ./power_management.nix ]; @@ -15,9 +14,22 @@ time.timeZone = "America/New_York"; i18n.defaultLocale = "en_US.UTF-8"; - me.optimizations.enable = false; me.secureBoot.enable = false; + me.optimizations = { + enable = false; + arch = "alderlake"; + system_features = [ + "gccarch-alderlake" + "gccarch-x86-64-v3" + "gccarch-x86-64-v4" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + }; + # Early KMS boot.initrd.kernelModules = [ "i915" ]; diff --git a/nix/configuration/hosts/neelix/optimized_build.nix b/nix/configuration/hosts/neelix/optimized_build.nix deleted file mode 100644 index c1c21ec..0000000 --- a/nix/configuration/hosts/neelix/optimized_build.nix +++ /dev/null @@ -1,80 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -{ - imports = [ ]; - - config = lib.mkMerge [ - { } - (lib.mkIf (!config.me.optimizations.enable) { - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_6_13; - }) - (lib.mkIf (config.me.optimizations.enable) { - nixpkgs.hostPlatform = { - gcc.arch = "alderlake"; - gcc.tune = "alderlake"; - system = "x86_64-linux"; - }; - - nixpkgs.overlays = [ - ( - self: super: - let - optimizeWithFlags = - pkg: flags: - pkg.overrideAttrs (old: { - NIX_CFLAGS_COMPILE = [ (old.NIX_CFLAGS_COMPILE or "") ] ++ flags; - }); - addConfig = - additionalConfig: pkg: - pkg.override (oldconfig: { - structuredExtraConfig = pkg.structuredExtraConfig // additionalConfig; - }); - in - { - linux_me = - addConfig - { - # Full preemption - PREEMPT = lib.mkOverride 60 lib.kernel.yes; - PREEMPT_VOLUNTARY = lib.mkOverride 60 lib.kernel.no; - - # Google's BBRv3 TCP congestion Control - TCP_CONG_BBR = lib.kernel.yes; - DEFAULT_BBR = lib.kernel.yes; - - # Preemptive Full Tickless Kernel at 300Hz - HZ = lib.kernel.freeform "300"; - HZ_300 = lib.kernel.yes; - HZ_1000 = lib.kernel.no; - } - ( - optimizeWithFlags super.linux_6_12 [ - "-march=alderlake" - "-mtune=alderlake" - ] - ); - } - ) - ]; - - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_me; - }) - (lib.mkIf (!config.me.buildingIso) { - nix.settings.system-features = lib.mkForce [ - "gccarch-alderlake" - "gccarch-x86-64-v3" - "benchmark" - "big-parallel" - "kvm" - "nixos-test" - ]; - }) - (lib.mkIf (config.me.buildingIso) { - boot.supportedFilesystems = [ "zfs" ]; - }) - ]; -} diff --git a/nix/configuration/hosts/odo/default.nix b/nix/configuration/hosts/odo/default.nix index c950775..d5042f7 100644 --- a/nix/configuration/hosts/odo/default.nix +++ b/nix/configuration/hosts/odo/default.nix @@ -8,7 +8,6 @@ imports = [ ./hardware-configuration.nix ./wrapped-disk-config.nix - ./optimized_build.nix ./distributed_build.nix ./power_management.nix ./screen_brightness.nix @@ -24,9 +23,24 @@ time.timeZone = "America/New_York"; i18n.defaultLocale = "en_US.UTF-8"; - me.optimizations.enable = true; me.secureBoot.enable = true; + me.optimizations = { + enable = true; + arch = "znver4"; + system_features = [ + "gccarch-znver4" + "gccarch-skylake" + # "gccarch-alderlake" missing WAITPKG + "gccarch-x86-64-v3" + "gccarch-x86-64-v4" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + }; + # Early KMS boot.initrd.kernelModules = [ "amdgpu" ]; diff --git a/nix/configuration/hosts/odo/optimized_build.nix b/nix/configuration/hosts/odo/optimized_build.nix deleted file mode 100644 index 3f5b975..0000000 --- a/nix/configuration/hosts/odo/optimized_build.nix +++ /dev/null @@ -1,131 +0,0 @@ -{ - config, - lib, - pkgs, - pkgs-unoptimized, - ... -}: -{ - imports = [ ]; - - config = lib.mkMerge [ - { } - (lib.mkIf (!config.me.optimizations.enable) { - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_6_14; - }) - (lib.mkIf (config.me.optimizations.enable) { - nixpkgs.hostPlatform = { - gcc.arch = "znver4"; - gcc.tune = "znver4"; - system = "x86_64-linux"; - }; - - nixpkgs.overlays = [ - ( - final: prev: - let - addConfig = - additionalConfig: pkg: - pkg.override (oldconfig: { - structuredExtraConfig = pkg.structuredExtraConfig // additionalConfig; - }); - in - { - linux_me = addConfig { - # Full preemption - PREEMPT = lib.mkOverride 60 lib.kernel.yes; - PREEMPT_VOLUNTARY = lib.mkOverride 60 lib.kernel.no; - - # Google's BBRv3 TCP congestion Control - TCP_CONG_BBR = lib.kernel.yes; - DEFAULT_BBR = lib.kernel.yes; - - # Preemptive Full Tickless Kernel at 300Hz - HZ = lib.kernel.freeform "300"; - HZ_300 = lib.kernel.yes; - HZ_1000 = lib.kernel.no; - } prev.linux_6_14; - # gsl = prev.gsl.overrideAttrs (old: { - # # gsl tests fails when optimizations are enabled. - # # > FAIL: cholesky_invert unscaled hilbert ( 4, 4)[0,2]: 2.55795384873636067e-13 0 - # # > (2.55795384873636067e-13 observed vs 0 expected) [28259614] - # doCheck = false; - # }); - } - ) - (final: prev: { - haskellPackages = prev.haskellPackages.extend ( - final': prev': { - inherit (pkgs-unoptimized.haskellPackages) - crypton - crypton-connection - crypton-x509 - crypton-x509-store - crypton-x509-system - crypton-x509-validation - hspec-wai - http-client-tls - http2 - pandoc - pandoc-cli - pandoc-lua-engine - pandoc-server - servant-server - tls - wai-app-static - wai-extra - warp - ; - } - ); - }) - (final: prev: { - inherit (pkgs-unoptimized) - gsl - redis - valkey - ; - }) - ]; - - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_me; - }) - (lib.mkIf (!config.me.buildingIso) { - nix.settings.system-features = lib.mkForce [ - "gccarch-znver4" - "gccarch-skylake" - # "gccarch-alderlake" missing WAITPKG - "gccarch-x86-64-v3" - "gccarch-x86-64-v4" - "benchmark" - "big-parallel" - "kvm" - "nixos-test" - ]; - - # Keep ALL dependencies so we can rebuild offline. This DRASTICALLY increase disk usage, but disk space is cheap. - # system.includeBuildDependencies = true; - - # This also should enable building offline? TODO: test. - nix.extraOptions = '' - keep-outputs = true - keep-derivations = true - ''; - - # # building ON - # nixpkgs.localSystem = { system = "aarch64-linux"; }; - # # building FOR - # nixpkgs.crossSystem = { system = "aarch64-linux"; }; - - # nixpkgs.config = { - # replaceStdenv = ({ pkgs }: pkgs.clangStdenv); - # }; - # or maybe an overlay - # stdenv = prev.clangStdenv; - - }) - (lib.mkIf (config.me.buildingIso) { - boot.supportedFilesystems.zfs = true; - }) - ]; -} diff --git a/nix/configuration/hosts/quark/default.nix b/nix/configuration/hosts/quark/default.nix index e235d50..317912d 100644 --- a/nix/configuration/hosts/quark/default.nix +++ b/nix/configuration/hosts/quark/default.nix @@ -9,7 +9,6 @@ ./disk-config.nix ./distributed_build.nix ./hardware-configuration.nix - ./optimized_build.nix ./power_management.nix ./wifi.nix ]; @@ -22,9 +21,25 @@ time.timeZone = "America/New_York"; i18n.defaultLocale = "en_US.UTF-8"; - me.optimizations.enable = true; me.secureBoot.enable = true; + me.optimizations = { + enable = true; + arch = "znver5"; + system_features = [ + "gccarch-znver4" + "gccarch-znver5" + "gccarch-skylake" + # "gccarch-alderlake" missing WAITPKG + "gccarch-x86-64-v3" + "gccarch-x86-64-v4" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + }; + # Early KMS boot.initrd.kernelModules = [ "amdgpu" ]; diff --git a/nix/configuration/hosts/quark/optimized_build.nix b/nix/configuration/hosts/quark/optimized_build.nix deleted file mode 100644 index 9cfb494..0000000 --- a/nix/configuration/hosts/quark/optimized_build.nix +++ /dev/null @@ -1,134 +0,0 @@ -{ - config, - lib, - pkgs, - pkgs-unoptimized, - ... -}: -{ - imports = [ ]; - - config = lib.mkMerge [ - { } - (lib.mkIf (!config.me.optimizations.enable) { - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_6_14; - }) - (lib.mkIf (config.me.optimizations.enable) { - nixpkgs.hostPlatform = { - gcc.arch = "znver5"; - gcc.tune = "znver5"; - system = "x86_64-linux"; - }; - - # Uncomment on of these to enable cross compiling: - # nixpkgs.buildPlatform = builtins.currentSystem; - # nixpkgs.buildPlatform = { - # gcc.arch = "znver4"; - # gcc.tune = "znver4"; - # system = "x86_64-linux"; - # }; - - nixpkgs.overlays = [ - ( - final: prev: - let - addConfig = - additionalConfig: pkg: - pkg.override (oldconfig: { - structuredExtraConfig = pkg.structuredExtraConfig // additionalConfig; - }); - in - { - linux_me = addConfig { - # Full preemption - PREEMPT = lib.mkOverride 60 lib.kernel.yes; - PREEMPT_VOLUNTARY = lib.mkOverride 60 lib.kernel.no; - - # Google's BBRv3 TCP congestion Control - TCP_CONG_BBR = lib.kernel.yes; - DEFAULT_BBR = lib.kernel.yes; - - # Preemptive Full Tickless Kernel at 300Hz - HZ = lib.kernel.freeform "300"; - HZ_300 = lib.kernel.yes; - HZ_1000 = lib.kernel.no; - } prev.linux_6_14; - } - ) - (final: prev: { - haskellPackages = prev.haskellPackages.extend ( - final': prev': { - inherit (pkgs-unoptimized.haskellPackages) - crypton - crypton-connection - crypton-x509 - crypton-x509-store - crypton-x509-system - crypton-x509-validation - hspec-wai - http-client-tls - http2 - pandoc - pandoc-cli - pandoc-lua-engine - pandoc-server - servant-server - tls - wai-app-static - wai-extra - warp - ; - } - ); - }) - (final: prev: { - inherit (pkgs-unoptimized) - gsl - redis - valkey - ; - }) - ]; - - boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_me; - }) - (lib.mkIf (!config.me.buildingIso) { - nix.settings.system-features = lib.mkForce [ - "gccarch-znver4" - "gccarch-znver5" - "gccarch-skylake" - # "gccarch-alderlake" missing WAITPKG - "gccarch-x86-64-v3" - "gccarch-x86-64-v4" - "benchmark" - "big-parallel" - "kvm" - "nixos-test" - ]; - - # Keep ALL dependencies so we can rebuild offline. This DRASTICALLY increase disk usage, but disk space is cheap. - # system.includeBuildDependencies = true; - - # This also should enable building offline? TODO: test. - nix.extraOptions = '' - keep-outputs = true - keep-derivations = true - ''; - - # # building ON - # nixpkgs.localSystem = { system = "aarch64-linux"; }; - # # building FOR - # nixpkgs.crossSystem = { system = "aarch64-linux"; }; - - # nixpkgs.config = { - # replaceStdenv = ({ pkgs }: pkgs.clangStdenv); - # }; - # or maybe an overlay - # stdenv = prev.clangStdenv; - - }) - (lib.mkIf (config.me.buildingIso) { - boot.supportedFilesystems.zfs = true; - }) - ]; -} diff --git a/nix/configuration/roles/global_options/default.nix b/nix/configuration/roles/global_options/default.nix index 5dec957..a6ffd5c 100644 --- a/nix/configuration/roles/global_options/default.nix +++ b/nix/configuration/roles/global_options/default.nix @@ -8,15 +8,6 @@ { imports = [ ]; - options.me = { - optimizations.enable = lib.mkOption { - type = lib.types.bool; - default = false; - example = true; - description = "Whether we want to enable CPU optimizations (will trigger a rebuild from source)."; - }; - }; - # options.me.graphics_card_type = lib.mkOption { # type = lib.types.nullOr ( # lib.types.enum [ diff --git a/nix/configuration/roles/optimized_build/default.nix b/nix/configuration/roles/optimized_build/default.nix new file mode 100644 index 0000000..eb53e3a --- /dev/null +++ b/nix/configuration/roles/optimized_build/default.nix @@ -0,0 +1,147 @@ +{ + config, + lib, + pkgs, + pkgs-unoptimized, + ... +}: + +{ + imports = [ ]; + + options.me = { + optimizations.enable = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether we want to enable CPU optimizations (will trigger a rebuild from source)."; + }; + + optimizations.arch = lib.mkOption { + type = lib.types.str; + default = null; + example = "znver4"; + description = "The CPU arch for which programs should be optimized."; + }; + + optimizations.system_features = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + example = [ + "gccarch-znver4" + "gccarch-znver5" + "gccarch-skylake" + # "gccarch-alderlake" missing WAITPKG + "gccarch-x86-64-v3" + "gccarch-x86-64-v4" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + description = "The list of CPU features that should be enabled on this machine."; + }; + }; + + config = lib.mkMerge [ + (lib.mkIf (!config.me.optimizations.enable) ( + lib.mkMerge [ + { + boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_6_14; + } + ] + )) + (lib.mkIf config.me.optimizations.enable ( + lib.mkMerge [ + { + boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_me; + + nixpkgs.hostPlatform = { + gcc.arch = config.me.optimizations.arch; + gcc.tune = config.me.optimizations.arch; + system = "x86_64-linux"; + }; + + # Uncomment on of these to enable cross compiling: + # nixpkgs.buildPlatform = builtins.currentSystem; + # nixpkgs.buildPlatform = { + # gcc.arch = "znver4"; + # gcc.tune = "znver4"; + # system = "x86_64-linux"; + # }; + + nixpkgs.overlays = [ + ( + final: prev: + let + addConfig = + additionalConfig: pkg: + pkg.override (oldconfig: { + structuredExtraConfig = pkg.structuredExtraConfig // additionalConfig; + }); + in + { + linux_me = addConfig { + # Full preemption + PREEMPT = lib.mkOverride 60 lib.kernel.yes; + PREEMPT_VOLUNTARY = lib.mkOverride 60 lib.kernel.no; + + # Google's BBRv3 TCP congestion Control + TCP_CONG_BBR = lib.kernel.yes; + DEFAULT_BBR = lib.kernel.yes; + + # Preemptive Full Tickless Kernel at 300Hz + HZ = lib.kernel.freeform "300"; + HZ_300 = lib.kernel.yes; + HZ_1000 = lib.kernel.no; + } prev.linux_6_14; + } + ) + (final: prev: { + haskellPackages = prev.haskellPackages.extend ( + final': prev': { + inherit (pkgs-unoptimized.haskellPackages) + crypto-token + crypton + crypton-connection + crypton-x509 + crypton-x509-store + crypton-x509-system + crypton-x509-validation + hspec-wai + http-client-tls + http2 + pandoc + pandoc-cli + pandoc-lua-engine + pandoc-server + servant-server + tls + wai-app-static + wai-extra + warp + ; + } + ); + }) + (final: prev: { + inherit (pkgs-unoptimized) + gsl + redis + valkey + ; + }) + ]; + } + ] + )) + (lib.mkIf (config.me.optimizations.system_features != [ ]) ( + lib.mkMerge [ + { + nix.settings.system-features = lib.mkForce config.me.optimizations.system_features; + } + ] + )) + + ]; +}