# Check current config: # nix build '/persist/machine_setup/nix/configuration#nixosConfigurations.hydra.pkgs.linux_me.configfile' # cat $(nix eval --raw '/persist/machine_setup/nix/configuration#nixosConfigurations.hydra.pkgs.linux_me.configfile') | less { config, lib, pkgs, ... }: let preemption_type = with lib.kernel; { full = { PREEMPT_DYNAMIC = yes; PREEMPT = yes; PREEMPT_VOLUNTARY = lib.mkForce no; PREEMPT_LAZY = lib.mkForce no; PREEMPT_NONE = no; }; lazy = { PREEMPT_DYNAMIC = yes; PREEMPT = no; PREEMPT_VOLUNTARY = lib.mkForce no; PREEMPT_LAZY = yes; PREEMPT_NONE = no; }; voluntary = { PREEMPT_DYNAMIC = no; PREEMPT = no; PREEMPT_VOLUNTARY = yes; PREEMPT_LAZY = lib.mkForce no; PREEMPT_NONE = no; }; none = { PREEMPT_DYNAMIC = no; PREEMPT = no; PREEMPT_VOLUNTARY = lib.mkForce no; PREEMPT_LAZY = lib.mkForce no; PREEMPT_NONE = yes; }; }; tick_hz = with lib.kernel; { "1000" = { HZ_1000 = yes; HZ = freeform "1000"; }; } // lib.genAttrs [ "100" "250" "300" "500" "600" "750" ] (hz: { HZ_1000 = no; "HZ_${hz}" = yes; HZ = freeform hz; }); performance_governor = with lib.kernel; { default = { CPU_FREQ_DEFAULT_GOV_SCHEDUTIL = yes; }; performance = { CPU_FREQ_DEFAULT_GOV_SCHEDUTIL = no; CPU_FREQ_DEFAULT_GOV_PERFORMANCE = yes; }; }; tick_rate = with lib.kernel; { # Always tick at the hz frequency. periodic = { NO_HZ_IDLE = no; NO_HZ_FULL = no; NO_HZ = no; NO_HZ_COMMON = no; HZ_PERIODIC = yes; }; # Idle - Do not disturb the CPU when idle. This can save power but increase latency. idle = { HZ_PERIODIC = no; NO_HZ_FULL = no; NO_HZ_IDLE = yes; NO_HZ = yes; NO_HZ_COMMON = yes; }; # Full dyntick system (tickless) - The kernel tries to shut down the tick whenever possible. tickless = { HZ_PERIODIC = no; NO_HZ_IDLE = no; NO_HZ_FULL = yes; NO_HZ = yes; NO_HZ_COMMON = yes; CONTEXT_TRACKING = yes; }; }; huge_page = with lib.kernel; { always = { TRANSPARENT_HUGEPAGE_MADVISE = no; TRANSPARENT_HUGEPAGE_ALWAYS = yes; }; madvise = { TRANSPARENT_HUGEPAGE_ALWAYS = no; TRANSPARENT_HUGEPAGE_MADVISE = yes; }; }; common_config = with lib.kernel; { # Google's BBRv3 TCP congestion Control TCP_CONG_BBR = yes; DEFAULT_BBR = yes; }; flavors = { server = lib.mkMerge [ preemption_type.none tick_hz."300" performance_governor.default tick_rate.tickless huge_page.madvise ]; interactive = with lib.kernel; lib.mkMerge [ { # Enable RCU Lazy - Reduces power consumption when idle or lightly loaded. Useful for battery-powered devices like laptops. RCU_LAZY = yes; } preemption_type.lazy tick_hz."300" performance_governor.default tick_rate.tickless huge_page.madvise ]; }; in { imports = [ ]; options.me = { kernel.enable = lib.mkOption { type = lib.types.bool; default = false; example = true; description = "Whether we want to install kernel."; }; kernel.version = lib.mkOption { type = lib.types.str; default = "linux"; # LTS example = "linux_6_18"; description = "What version of the kernl should we use."; }; kernel.flavor = lib.mkOption { type = lib.types.str; default = "interactive"; example = "server"; description = "What type of kernel should be built."; }; }; config = lib.mkIf config.me.kernel.enable ( lib.mkMerge [ { boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux_me; } (lib.mkIf (!config.me.optimizations.enable) { nixpkgs.overlays = [ (final: prev: { linux_me = final."${config.me.kernel.version}"; }) ]; }) (lib.mkIf (config.me.optimizations.enable) { nixpkgs.overlays = [ ( final: prev: let addConfig = additionalConfig: pkg: pkg.override (oldconfig: { structuredExtraConfig = lib.mkMerge ([ pkg.structuredExtraConfig ] ++ additionalConfig); # stdenv = pkgs.llvmPackages_latest.stdenv; # stdenv = pkgs.clangStdenv; }); in { linux_me = addConfig ([ common_config flavors."${config.me.kernel.flavor}" ]) final."${config.me.kernel.version}"; } ) ]; }) ] ); }