1{ config, lib, ... }:
2
3with lib;
4
5let
6 cfg = config.hardware.ksm;
7
8in {
9 imports = [
10 (mkRenamedOptionModule [ "hardware" "enableKSM" ] [ "hardware" "ksm" "enable" ])
11 ];
12
13 options.hardware.ksm = {
14 enable = mkEnableOption "Linux kernel Same-Page Merging";
15 sleep = mkOption {
16 type = types.nullOr types.int;
17 default = null;
18 description = ''
19 How many milliseconds ksmd should sleep between scans.
20 Setting it to `null` uses the kernel's default time.
21 '';
22 };
23 };
24
25 config = mkIf cfg.enable {
26 systemd.services.enable-ksm = {
27 description = "Enable Kernel Same-Page Merging";
28 wantedBy = [ "multi-user.target" ];
29 script =
30 ''
31 echo 1 > /sys/kernel/mm/ksm/run
32 '' + optionalString (cfg.sleep != null)
33 ''
34 echo ${toString cfg.sleep} > /sys/kernel/mm/ksm/sleep_millisecs
35 '';
36 };
37 };
38}