From b0f10d2d531ebac8130c8f111570311ac758da8e Mon Sep 17 00:00:00 2001 From: "(cdep)illabout" Date: Sat, 29 Dec 2018 22:09:47 +0900 Subject: [PATCH] cpufreq: add option for setting the cpu max and min frequencies This adds a NixOS option for setting the CPU max and min frequencies with `cpufreq`. The two options that have been added are: - `powerManagement.cpufreq.max` - `powerManagement.cpufreq.min` It also adds an alias to the `powerManagement.cpuFreqGovernor` option as `powerManagement.cpufreq.governor`. This updates the installer to use the new option name. It also updates the manual with a note about the new name. --- nixos/doc/manual/release-notes/rl-1903.xml | 10 +++ .../installer/tools/nixos-generate-config.pl | 2 +- nixos/modules/rename.nix | 3 + nixos/modules/services/hardware/tlp.nix | 4 +- nixos/modules/tasks/cpu-freq.nix | 71 ++++++++++++++----- 5 files changed, 69 insertions(+), 21 deletions(-) diff --git a/nixos/doc/manual/release-notes/rl-1903.xml b/nixos/doc/manual/release-notes/rl-1903.xml index 89d9f48aedd3..65761c12c6a4 100644 --- a/nixos/doc/manual/release-notes/rl-1903.xml +++ b/nixos/doc/manual/release-notes/rl-1903.xml @@ -408,6 +408,16 @@ from nixpkgs due to the lack of maintainers. + + + The option has been + aliased to . On laptops, + is sometimes set in + /etc/nixos/hardware-configuration.nix, so you can + rename it to the new name, or run + nixos-generate-config again. + + diff --git a/nixos/modules/installer/tools/nixos-generate-config.pl b/nixos/modules/installer/tools/nixos-generate-config.pl index 52a129b39bcd..fa01dc7bbaf0 100644 --- a/nixos/modules/installer/tools/nixos-generate-config.pl +++ b/nixos/modules/installer/tools/nixos-generate-config.pl @@ -104,7 +104,7 @@ if (-e "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors") { foreach $e (@desired_governors) { if (index($governors, $e) != -1) { - last if (push @attrs, "powerManagement.cpuFreqGovernor = lib.mkDefault \"$e\";"); + last if (push @attrs, "powerManagement.cpufreq.governor = lib.mkDefault \"$e\";"); } } } diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix index dc0a175d5bb8..0ed0f4ac209a 100644 --- a/nixos/modules/rename.nix +++ b/nixos/modules/rename.nix @@ -286,6 +286,9 @@ with lib; (mkRenamedOptionModule [ "hardware" "ckb" "enable" ] [ "hardware" "ckb-next" "enable" ]) (mkRenamedOptionModule [ "hardware" "ckb" "package" ] [ "hardware" "ckb-next" "package" ]) + # cpufeq + (mkAliasOptionModule [ "powerManagement" "cpuFreqGovernor" ] [ "powerManagement" "cpufreq" "governor" ]) + ] ++ (flip map [ "blackboxExporter" "collectdExporter" "fritzboxExporter" "jsonExporter" "minioExporter" "nginxExporter" "nodeExporter" "snmpExporter" "unifiExporter" "varnishExporter" ] diff --git a/nixos/modules/services/hardware/tlp.nix b/nixos/modules/services/hardware/tlp.nix index 68425822a884..bbc5b5b80a08 100644 --- a/nixos/modules/services/hardware/tlp.nix +++ b/nixos/modules/services/hardware/tlp.nix @@ -55,7 +55,9 @@ in config = mkIf cfg.enable { powerManagement.scsiLinkPolicy = null; - powerManagement.cpuFreqGovernor = null; + powerManagement.cpufreq.governor = null; + powerManagement.cpufreq.max = null; + powerManagement.cpufreq.min = null; systemd.sockets."systemd-rfkill".enable = false; diff --git a/nixos/modules/tasks/cpu-freq.nix b/nixos/modules/tasks/cpu-freq.nix index 5f8b5df52acf..684c43a1e903 100644 --- a/nixos/modules/tasks/cpu-freq.nix +++ b/nixos/modules/tasks/cpu-freq.nix @@ -4,22 +4,43 @@ with lib; let cpupower = config.boot.kernelPackages.cpupower; - cfg = config.powerManagement; + cfg = config.powerManagement.cpufreq; in { ###### interface - options = { + options.powerManagement.cpufreq = { - powerManagement.cpuFreqGovernor = mkOption { + governor = mkOption { type = types.nullOr types.str; default = null; example = "ondemand"; description = '' Configure the governor used to regulate the frequence of the available CPUs. By default, the kernel configures the - performance governor. + performance governor, although this may be overwriten in your + hardware-configuration.nix file. + + Often used values: "ondemand", "powersave", "performance" + ''; + }; + + max = mkOption { + type = types.nullOr types.ints.unsigned; + default = null; + example = 2200000; + description = '' + The maximum frequency the CPU will use. Defaults to the maximum possible. + ''; + }; + + min = mkOption { + type = types.nullOr types.ints.unsigned; + default = null; + example = 800000; + description = '' + The minimum frequency the CPU will use. ''; }; @@ -28,25 +49,37 @@ in ###### implementation - config = mkIf (!config.boot.isContainer && config.powerManagement.cpuFreqGovernor != null) { + config = + let + governorEnable = cfg.governor != null; + maxEnable = cfg.max != null; + minEnable = cfg.min != null; + enable = + !config.boot.isContainer && + (governorEnable || maxEnable || minEnable); + in + mkIf enable { - boot.kernelModules = [ "cpufreq_${cfg.cpuFreqGovernor}" ]; + boot.kernelModules = optional governorEnable "cpufreq_${cfg.governor}"; - environment.systemPackages = [ cpupower ]; + environment.systemPackages = [ cpupower ]; - systemd.services.cpufreq = { - description = "CPU Frequency Governor Setup"; - after = [ "systemd-modules-load.service" ]; - wantedBy = [ "multi-user.target" ]; - path = [ cpupower pkgs.kmod ]; - unitConfig.ConditionVirtualization = false; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - ExecStart = "${cpupower}/bin/cpupower frequency-set -g ${cfg.cpuFreqGovernor}"; - SuccessExitStatus = "0 237"; + systemd.services.cpufreq = { + description = "CPU Frequency Setup"; + after = [ "systemd-modules-load.service" ]; + wantedBy = [ "multi-user.target" ]; + path = [ cpupower pkgs.kmod ]; + unitConfig.ConditionVirtualization = false; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + ExecStart = "${cpupower}/bin/cpupower frequency-set " + + optionalString governorEnable "--governor ${cfg.governor} " + + optionalString maxEnable "--max ${toString cfg.max} " + + optionalString minEnable "--min ${toString cfg.min} "; + SuccessExitStatus = "0 237"; + }; }; - }; }; }