nixpkgs/pkgs/os-specific/linux/kernel/zen-kernels.nix
Thiago Kenji Okada be1d7789aa linuxKernel.kernels.linux_{lqx,zen}: add custom extra config
This is based on the following sources:
- https://gitlab.archlinux.org/archlinux/packaging/packages/linux-zen/-/blob/main/config
- https://github.com/damentz/liquorix-package/blob/6.4/master/linux-liquorix/debian/config/kernelarch-x86/config-arch-64
- https://liquorix.net/

This is not supposed to be exhaustive, so we may not completely match
upstream here. However, we should get most of the improvements in upstream
webpage, and there is always space for further tuning in the future.

Fixes: #241986
2023-07-11 20:40:51 +01:00

116 lines
3.7 KiB
Nix

{ lib, fetchFromGitHub, buildLinux, ... } @ args:
let
# comments with variant added for update script
# ./update-zen.py zen
zenVariant = {
version = "6.4.2"; #zen
suffix = "zen1"; #zen
sha256 = "1swd3y97w55wh9vl6k1bsrx6fqi6b6ssbw306h87nxn36xwzx8cd"; #zen
isLqx = false;
};
# ./update-zen.py lqx
lqxVariant = {
version = "6.4.2"; #lqx
suffix = "lqx1"; #lqx
sha256 = "14hr88lbwm2pz3knw6nxlahdk4pwwb4ya63mrd7zg7g1x2xhfb59"; #lqx
isLqx = true;
};
zenKernelsFor = { version, suffix, sha256, isLqx }: buildLinux (args // {
inherit version;
modDirVersion = lib.versions.pad 3 "${version}-${suffix}";
isZen = true;
src = fetchFromGitHub {
owner = "zen-kernel";
repo = "zen-kernel";
rev = "v${version}-${suffix}";
inherit sha256;
};
# This is based on the following sources:
# - zen: https://gitlab.archlinux.org/archlinux/packaging/packages/linux-zen/-/blob/main/config
# - lqx: https://github.com/damentz/liquorix-package/blob/6.4/master/linux-liquorix/debian/config/kernelarch-x86/config-arch-64
# - Liquorix features: https://liquorix.net/
# The list below is not exhaustive, so the kernels probably doesn't match
# the upstream, but should bring most of the improvements that will be
# expected by users
structuredExtraConfig = with lib.kernel; {
# Zen Interactive tuning
ZEN_INTERACTIVE = yes;
# FQ-Codel Packet Scheduling
NET_SCH_DEFAULT = yes;
DEFAULT_FQ_CODEL = yes;
DEFAULT_NET_SCH = freeform "fq_codel";
# Preempt (low-latency)
PREEMPT = lib.mkOverride 60 yes;
PREEMPT_VOLUNTARY = lib.mkOverride 60 no;
# Preemptible tree-based hierarchical RCU
TREE_RCU = yes;
PREEMPT_RCU = yes;
RCU_EXPERT = yes;
TREE_SRCU = yes;
TASKS_RCU_GENERIC = yes;
TASKS_RCU = yes;
TASKS_RUDE_RCU = yes;
TASKS_TRACE_RCU = yes;
RCU_STALL_COMMON = yes;
RCU_NEED_SEGCBLIST = yes;
RCU_FANOUT = freeform "64";
RCU_FANOUT_LEAF = freeform "16";
RCU_BOOST = yes;
RCU_BOOST_DELAY = freeform "500";
RCU_NOCB_CPU = yes;
RCU_LAZY = yes;
# Futex WAIT_MULTIPLE implementation for Wine / Proton Fsync.
FUTEX = yes;
FUTEX_PI = yes;
# Preemptive Full Tickless Kernel at 1000Hz
HZ = freeform "1000";
HZ_1000 = yes;
} // lib.optionalAttrs (isLqx) {
# Google's BBRv2 TCP congestion Control
TCP_CONG_BBR2 = yes;
DEFAULT_BBR2 = yes;
DEFAULT_TCP_CONG = freeform "bbr2";
# PDS Process Scheduler
SCHED_ALT = yes;
SCHED_PDS = yes;
# Swap storage is compressed with LZ4 using zswap
ZSWAP_COMPRESSOR_DEFAULT_LZ4 = yes;
ZSWAP_COMPRESSOR_DEFAULT = freeform "lz4";
# Fix error: unused option: XXX.
CFS_BANDWIDTH = lib.mkForce (option no);
PSI = lib.mkForce (option no);
RT_GROUP_SCHED = lib.mkForce (option no);
SCHED_AUTOGROUP = lib.mkForce (option no);
SCHED_CORE = lib.mkForce (option no);
# ERROR: modpost: "sched_numa_hop_mask" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
MLX5_CORE = no;
};
passthru.updateScript = [ ./update-zen.py (if isLqx then "lqx" else "zen") ];
extraMeta = {
branch = lib.versions.majorMinor version + "/master";
maintainers = with lib.maintainers; [ thiagokokada ];
description = "Built using the best configuration and kernel sources for desktop, multimedia, and gaming workloads." +
lib.optionalString isLqx " (Same as linux_zen, but less aggressive release schedule and additional extra config)";
};
} // (args.argsOverride or { }));
in
{
zen = zenKernelsFor zenVariant;
lqx = zenKernelsFor lqxVariant;
}