diff --git a/nixos/doc/manual/release-notes/rl-2411.section.md b/nixos/doc/manual/release-notes/rl-2411.section.md index ab018c6ac5aa..e62065775b91 100644 --- a/nixos/doc/manual/release-notes/rl-2411.section.md +++ b/nixos/doc/manual/release-notes/rl-2411.section.md @@ -34,6 +34,9 @@ - The `moonlight-qt` package (for [Moonlight game streaming](https://moonlight-stream.org/)) now has HDR support on Linux systems. +- [Sched-ext](https://github.com/sched-ext/scx), a Linux kernel feature to run schedulers in userspace, is now available [`services.scx`](options.html#opt-services.scx.enable). + Requires Linux kernel version 6.12 or later. + - PostgreSQL now defaults to major version 16. - GNOME has been updated to version 47. Refer to the [release notes](https://release.gnome.org/47/) for more details. diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index e7a898f51af4..c68ab5b721cf 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -1300,6 +1300,7 @@ ./services/scheduling/atd.nix ./services/scheduling/cron.nix ./services/scheduling/fcron.nix + ./services/scheduling/scx.nix ./services/search/elasticsearch-curator.nix ./services/search/elasticsearch.nix ./services/search/hound.nix diff --git a/nixos/modules/services/scheduling/scx.nix b/nixos/modules/services/scheduling/scx.nix new file mode 100644 index 000000000000..279d13539b4f --- /dev/null +++ b/nixos/modules/services/scheduling/scx.nix @@ -0,0 +1,110 @@ +{ + lib, + pkgs, + config, + ... +}: +let + cfg = config.services.scx; +in +{ + options.services.scx = { + enable = lib.mkEnableOption null // { + description = '' + Whether to enable SCX service, a daemon to run schedulers from userspace. + + ::: {.note} + This service requires a kernel with the Sched-ext feature. + Generally, kernel version 6.12 and later are supported. + ::: + ''; + }; + + package = lib.mkOption { + type = lib.types.package; + default = pkgs.scx.full; + defaultText = lib.literalExpression "pkgs.scx.full"; + example = lib.literalExpression "pkgs.scx.rustland"; + description = '' + `scx` package to use. `scx.full`, which includes all schedulers, is the default. + You may choose a minimal package, such as `pkgs.scx.rustland`, if only one specific scheduler is needed. + + ::: {.note} + Overriding this does not change the default scheduler; you should set `services.scx.scheduler` for it. + ::: + ''; + }; + + scheduler = lib.mkOption { + type = lib.types.enum [ + "scx_bpfland" + "scx_central" + "scx_flatcg" + "scx_lavd" + "scx_layered" + "scx_nest" + "scx_pair" + "scx_qmap" + "scx_rlfifo" + "scx_rustland" + "scx_rusty" + "scx_simple" + "scx_userland" + ]; + default = "scx_rustland"; + example = "scx_bpfland"; + description = '' + Which scheduler to use. See [SCX documentation](https://github.com/sched-ext/scx/tree/main/scheds) + for details on each scheduler and guidance on selecting the most suitable one. + ''; + }; + + extraArgs = lib.mkOption { + type = lib.types.listOf lib.types.singleLineStr; + example = [ + "--slice-us 5000" + "--verbose" + ]; + description = '' + Parameters passed to the chosen scheduler at runtime. + + ::: {.note} + Run `chosen-scx-scheduler --help` to see the available options. Generally, + each scheduler has its own set of options, and they are incompatible with each other. + ::: + ''; + }; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + + systemd.services.scx = { + description = "SCX scheduler daemon"; + + # SCX service should be started only if the kernel supports sched-ext + unitConfig.ConditionPathIsDirectory = "/sys/kernel/sched_ext"; + + startLimitIntervalSec = 30; + startLimitBurst = 2; + + serviceConfig = { + Type = "simple"; + ExecStart = "${lib.getExe' cfg.package cfg.scheduler} ${lib.concatStringsSep " " cfg.extraArgs}"; + Restart = "on-failure"; + StandardError = "journal"; + }; + + wantedBy = [ "multi-user.target" ]; + }; + + assertions = [ + { + assertion = lib.versionAtLeast config.boot.kernelPackages.kernel.version "6.12"; + message = "SCX is only supported on kernel version >= 6.12."; + } + ]; + }; + + meta.maintainers = with lib.maintainers; [ johnrtitor ]; +}