{ 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 ]; }