idiosyn/nixos/module/clusters.nix
2024-08-21 21:06:51 +02:00

47 lines
1.2 KiB
Nix

{ ... }: { config, lib, ... }:
let
cfg = config.hardware.cpu.clusters;
concat = lib.concatMapStringsSep "," toString;
performance = concat cfg.performance;
efficiency = concat cfg.efficiency;
in {
options = {
hardware.cpu.clusters = {
performance = lib.mkOption {
type = with lib.types; listOf ints.unsigned;
default = [ ];
description = "List of performance CPUs";
};
efficiency = lib.mkOption {
type = with lib.types; listOf ints.unsigned;
default = [ ];
description = "List of efficiency CPUs";
};
};
};
config = lib.mkIf (cfg.performance != [ ] && cfg.efficiency != [ ]) {
boot.kernelParams = [
"irqaffinity=${efficiency}"
"nohz_full=${performance}"
"rcu_nocbs=all"
];
systemd.slices = lib.genAttrs [ "system" ] (slice: {
sliceConfig.AllowedCPUs = efficiency;
});
systemd.user.slices = lib.genAttrs [ "session" "app" ] (slice: {
sliceConfig.AllowedCPUs = efficiency;
});
assertions = lib.singleton {
assertion = lib.mutuallyExclusive cfg.performance cfg.efficiency;
message = "Performance and efficiency clusters must not overlap";
};
};
}