about summary refs log tree commit diff
path: root/modules/system/kernel/zswap.nix
blob: 007c6ae4bb2fa3ab9a2ce2fcef16a13d42c1735b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{ config, pkgs, lib, ... }:

let
  kernelVersion = config.boot.kernelPackages.kernel.version;
  hasZstd = lib.versionAtLeast kernelVersion "4.18";
in {
  options.vuizvui.system.kernel.zswap.enable = lib.mkOption {
    type = lib.types.bool;
    default = false;
    description = ''
      Whether to enable support for zswap with <literal>z3fold</literal> for
      pooling and <literal>zstd</literal> for compression, if available
      (otherwise it falls back to <literal>lzo</literal>).

      Zswap is a compressed cache for swap pages, which is especially useful
      for machines with limited RAM.
    '';
  };

  config = lib.mkIf config.vuizvui.system.kernel.zswap.enable {
    boot.kernelPatches = lib.singleton {
      name = "zswap-config";
      # This patch is needed until it hits stable/mainline to prevent z3fold
      # crashes.
      #
      # See also: https://bugs.chromium.org/p/chromium/issues/detail?id=822360
      patch = pkgs.fetchpatch {
        name = "z3fold-fix-wrong-handling-of-headless-pages.patch";
        url = "https://patchwork.kernel.org/patch/10510583/raw/";
        sha256 = "0c9l912zgxwy31b7m4xkf31imzvjs11n1i6v5w2sykqfx3sk6a3b";
      };
      extraConfig = ''
        CRYPTO_${if hasZstd then "ZSTD" else "LZO"} y
        ZSWAP y
        Z3FOLD y
      '';
    };

    boot.kernelParams = [
      "zswap.enabled=1"
      "zswap.zpool=z3fold"
      "zswap.compressor=${if hasZstd then "zstd" else "lzo"}"
    ];
  };
}