195 lines
4.8 KiB
Nix
195 lines
4.8 KiB
Nix
# 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}";
|
|
}
|
|
)
|
|
];
|
|
})
|
|
]
|
|
);
|
|
}
|