Merge master into staging-next

Changed files
+88 -982
nixos
pkgs
applications
audio
emulators
86box
misc
mediainfo-gui
networking
ipget
virtualization
by-name
pr
presenterm
ri
rimgo
development
libraries
libmediainfo
lightstep-tracer-cpp
python-modules
pycatch22
tools
misc
runme
os-specific
tools
package-management
nix-du
top-level
-1
nixos/tests/kernel-generic.nix
···
}) args);
kernels = pkgs.linuxKernel.vanillaPackages // {
inherit (pkgs.linuxKernel.packages)
-
linux_4_14_hardened
linux_4_19_hardened
linux_5_4_hardened
linux_5_10_hardened
···
}) args);
kernels = pkgs.linuxKernel.vanillaPackages // {
inherit (pkgs.linuxKernel.packages)
linux_4_19_hardened
linux_5_4_hardened
linux_5_10_hardened
+31 -18
pkgs/applications/audio/ardour/6.nix pkgs/applications/audio/ardour/7.nix
···
-
{ lib, stdenv
, fetchgit
, alsa-lib
, aubio
, boost
···
}:
stdenv.mkDerivation rec {
pname = "ardour";
-
version = "6.9";
# We can't use `fetchFromGitea` here, as attempting to fetch release archives from git.ardour.org
# result in an empty archive. See https://tracker.ardour.org/view.php?id=7328 for more info.
src = fetchgit {
url = "git://git.ardour.org/ardour/ardour.git";
rev = version;
-
sha256 = "0vlcbd70y0an881zv87kc3akmaiz4w7whsy3yaiiqqjww35jg1mm";
};
patches = [
# AS=as in the environment causes build failure https://tracker.ardour.org/view.php?id=8096
./as-flags.patch
];
nativeBuildInputs = [
doxygen
graphviz # for dot
···
# removed because it fixes https://tracker.ardour.org/view.php?id=8161 and https://tracker.ardour.org/view.php?id=8437
# "--use-external-libs"
-
# Ardour's wscript requires git revision and date to be available.
-
# Since they are not, let's generate the file manually.
-
postPatch = ''
-
printf '#include "libs/ardour/ardour/revision.h"\nnamespace ARDOUR { const char* revision = "${version}"; const char* date = ""; }\n' > libs/ardour/revision.cc
-
sed 's|/usr/include/libintl.h|${glibc.dev}/include/libintl.h|' -i wscript
-
patchShebangs ./tools/
-
substituteInPlace libs/ardour/video_tools_paths.cc \
-
--replace 'ffmpeg_exe = X_("");' 'ffmpeg_exe = X_("${ffmpeg}/bin/ffmpeg");' \
-
--replace 'ffprobe_exe = X_("");' 'ffprobe_exe = X_("${ffmpeg}/bin/ffprobe");'
-
'';
-
postInstall = ''
# wscript does not install these for some reason
install -vDm 644 "build/gtk2_ardour/ardour.xml" \
-t "$out/share/mime/packages"
-
install -vDm 644 "build/gtk2_ardour/ardour6.desktop" \
-t "$out/share/applications"
for size in 16 22 32 48 256 512; do
install -vDm 644 "gtk2_ardour/resources/Ardour-icon_''${size}px.png" \
-
"$out/share/icons/hicolor/''${size}x''${size}/apps/ardour6.png"
done
install -vDm 644 "ardour.1"* -t "$out/share/man/man1"
'' + lib.optionalString videoSupport ''
# `harvid` and `xjadeo` must be accessible in `PATH` for video to work.
-
wrapProgram "$out/bin/ardour6" \
--prefix PATH : "${lib.makeBinPath [ harvid xjadeo ]}"
'';
···
'';
homepage = "https://ardour.org/";
license = licenses.gpl2Plus;
-
mainProgram = "ardour6";
platforms = platforms.linux;
maintainers = with maintainers; [ goibhniu magnetophon mitchmindtree ];
};
···
+
{ lib
+
, stdenv
, fetchgit
+
, fetchzip
, alsa-lib
, aubio
, boost
···
}:
stdenv.mkDerivation rec {
pname = "ardour";
+
version = "7.5";
# We can't use `fetchFromGitea` here, as attempting to fetch release archives from git.ardour.org
# result in an empty archive. See https://tracker.ardour.org/view.php?id=7328 for more info.
src = fetchgit {
url = "git://git.ardour.org/ardour/ardour.git";
rev = version;
+
hash = "sha256-cmYt6fGYuuVs6YhAXaO9AG6TrYLDVUaE1/iC67rt76I=";
+
};
+
+
bundledContent = fetchzip {
+
url = "https://web.archive.org/web/20221026200824/http://stuff.ardour.org/loops/ArdourBundledMedia.zip";
+
hash = "sha256-IbPQWFeyMuvCoghFl1ZwZNNcSvLNsH84rGArXnw+t7A=";
+
# archive does not contain a single folder at the root
+
stripRoot = false;
};
patches = [
# AS=as in the environment causes build failure https://tracker.ardour.org/view.php?id=8096
./as-flags.patch
+
./default-plugin-search-paths.patch
];
+
# Ardour's wscript requires git revision and date to be available.
+
# Since they are not, let's generate the file manually.
+
postPatch = ''
+
printf '#include "libs/ardour/ardour/revision.h"\nnamespace ARDOUR { const char* revision = "${version}"; const char* date = ""; }\n' > libs/ardour/revision.cc
+
sed 's|/usr/include/libintl.h|${glibc.dev}/include/libintl.h|' -i wscript
+
patchShebangs ./tools/
+
substituteInPlace libs/ardour/video_tools_paths.cc \
+
--replace 'ffmpeg_exe = X_("");' 'ffmpeg_exe = X_("${ffmpeg}/bin/ffmpeg");' \
+
--replace 'ffprobe_exe = X_("");' 'ffprobe_exe = X_("${ffmpeg}/bin/ffprobe");'
+
'';
+
nativeBuildInputs = [
doxygen
graphviz # for dot
···
# removed because it fixes https://tracker.ardour.org/view.php?id=8161 and https://tracker.ardour.org/view.php?id=8437
# "--use-external-libs"
postInstall = ''
# wscript does not install these for some reason
install -vDm 644 "build/gtk2_ardour/ardour.xml" \
-t "$out/share/mime/packages"
+
install -vDm 644 "build/gtk2_ardour/ardour${lib.versions.major version}.desktop" \
-t "$out/share/applications"
for size in 16 22 32 48 256 512; do
install -vDm 644 "gtk2_ardour/resources/Ardour-icon_''${size}px.png" \
+
"$out/share/icons/hicolor/''${size}x''${size}/apps/ardour${lib.versions.major version}.png"
done
install -vDm 644 "ardour.1"* -t "$out/share/man/man1"
+
+
# install additional bundled beats, chords and progressions
+
cp -rp "${bundledContent}"/* "$out/share/ardour${lib.versions.major version}/media"
'' + lib.optionalString videoSupport ''
# `harvid` and `xjadeo` must be accessible in `PATH` for video to work.
+
wrapProgram "$out/bin/ardour${lib.versions.major version}" \
--prefix PATH : "${lib.makeBinPath [ harvid xjadeo ]}"
'';
···
'';
homepage = "https://ardour.org/";
license = licenses.gpl2Plus;
+
mainProgram = "ardour7";
platforms = platforms.linux;
maintainers = with maintainers; [ goibhniu magnetophon mitchmindtree ];
};
+4 -4
pkgs/applications/audio/ardour/default.nix
···
, vamp-plugin-sdk
, wafHook
, xjadeo
, videoSupport ? true
}:
stdenv.mkDerivation rec {
pname = "ardour";
-
version = "7.5";
# We can't use `fetchFromGitea` here, as attempting to fetch release archives from git.ardour.org
# result in an empty archive. See https://tracker.ardour.org/view.php?id=7328 for more info.
src = fetchgit {
url = "git://git.ardour.org/ardour/ardour.git";
rev = version;
-
hash = "sha256-cmYt6fGYuuVs6YhAXaO9AG6TrYLDVUaE1/iC67rt76I=";
};
bundledContent = fetchzip {
···
"--docs"
"--freedesktop"
"--no-phone-home"
-
"--optimize"
"--ptformat"
"--run-tests"
"--test"
-
];
# removed because it fixes https://tracker.ardour.org/view.php?id=8161 and https://tracker.ardour.org/view.php?id=8437
# "--use-external-libs"
···
, vamp-plugin-sdk
, wafHook
, xjadeo
+
, optimize ? true # disable to print Lua DSP script output to stdout
, videoSupport ? true
}:
stdenv.mkDerivation rec {
pname = "ardour";
+
version = "8.0";
# We can't use `fetchFromGitea` here, as attempting to fetch release archives from git.ardour.org
# result in an empty archive. See https://tracker.ardour.org/view.php?id=7328 for more info.
src = fetchgit {
url = "git://git.ardour.org/ardour/ardour.git";
rev = version;
+
hash = "sha256-ZL8aTq2OsCWwLUUx5XYbH4eRN+Xz+oMAj9IS07RfTag=";
};
bundledContent = fetchzip {
···
"--docs"
"--freedesktop"
"--no-phone-home"
"--ptformat"
"--run-tests"
"--test"
+
] ++ lib.optional optimize "--optimize";
# removed because it fixes https://tracker.ardour.org/view.php?id=8161 and https://tracker.ardour.org/view.php?id=8437
# "--use-external-libs"
+2 -2
pkgs/applications/emulators/86box/default.nix
···
stdenv.mkDerivation rec {
pname = "86Box";
-
version = "4.0";
src = fetchFromGitHub {
owner = "86Box";
repo = "86Box";
rev = "v${version}";
-
hash = "sha256-VTfYCVEbArcYVzh3NkX1yBXhtRnGZ/+khk0KG42fs24=";
};
nativeBuildInputs = [
···
stdenv.mkDerivation rec {
pname = "86Box";
+
version = "4.0.1";
src = fetchFromGitHub {
owner = "86Box";
repo = "86Box";
rev = "v${version}";
+
hash = "sha256-1005Czm4CftL96G0+sKV1wx/ogXTKS0vQAzZHtIMlKA=";
};
nativeBuildInputs = [
+2 -2
pkgs/applications/misc/mediainfo-gui/default.nix
···
in
stdenv.mkDerivation rec {
pname = "mediainfo-gui";
-
version = "23.07";
src = fetchurl {
url = "https://mediaarea.net/download/source/mediainfo/${version}/mediainfo_${version}.tar.xz";
-
hash = "sha256-ttfanimZX9NKIhAIJbhD50wyx7xnrbARZrG+7epJ9dA=";
};
nativeBuildInputs = [ autoreconfHook pkg-config ];
···
in
stdenv.mkDerivation rec {
pname = "mediainfo-gui";
+
version = "23.10";
src = fetchurl {
url = "https://mediaarea.net/download/source/mediainfo/${version}/mediainfo_${version}.tar.xz";
+
hash = "sha256-t0OuJSHZ2Oi5pYUNfCop3jC6d321JzjQ37oXzARnduc=";
};
nativeBuildInputs = [ autoreconfHook pkg-config ];
+3 -3
pkgs/applications/networking/ipget/default.nix
···
buildGoModule rec {
pname = "ipget";
-
version = "0.9.2";
src = fetchFromGitHub {
owner = "ipfs";
repo = "ipget";
rev = "v${version}";
-
hash = "sha256-gcxfsP5awCCau1RqCuXKEdXC2jvpwsGsPkBsiaRlfBU=";
};
-
vendorHash = "sha256-qCUa/XbfDrbwPSZywNVK/yn88C7Dsmz0cDTG2Z4ho0Y=";
postPatch = ''
# main module (github.com/ipfs/ipget) does not contain package github.com/ipfs/ipget/sharness/dependencies
···
buildGoModule rec {
pname = "ipget";
+
version = "0.10.0";
src = fetchFromGitHub {
owner = "ipfs";
repo = "ipget";
rev = "v${version}";
+
hash = "sha256-nT0bMy4L1T2rwE6g3Q4tNkmeP3XyPVxCV9yoGqMZjNs=";
};
+
vendorHash = "sha256-q8uwijh3y4l4ebFc3u5Z6TLUUiQqUK6Qpqq/m0kLF14=";
postPatch = ''
# main module (github.com/ipfs/ipget) does not contain package github.com/ipfs/ipget/sharness/dependencies
+2 -2
pkgs/applications/virtualization/qemu/default.nix
···
+ lib.optionalString xenSupport "-xen"
+ lib.optionalString hostCpuOnly "-host-cpu-only"
+ lib.optionalString nixosTestRunner "-for-vm-tests";
-
version = "8.1.1";
src = fetchurl {
url = "https://download.qemu.org/qemu-${finalAttrs.version}.tar.xz";
-
hash = "sha256-N84u9eUA+3UvaBEXxotFEYMD6kmn4mvVQIDO1U+rfe8=";
};
depsBuildBuild = [ buildPackages.stdenv.cc ]
···
+ lib.optionalString xenSupport "-xen"
+ lib.optionalString hostCpuOnly "-host-cpu-only"
+ lib.optionalString nixosTestRunner "-for-vm-tests";
+
version = "8.1.2";
src = fetchurl {
url = "https://download.qemu.org/qemu-${finalAttrs.version}.tar.xz";
+
hash = "sha256-VBUmp2RXbrSU0v9exGrrJT5i6ikDXRwjwKivTmzU8Ic=";
};
depsBuildBuild = [ buildPackages.stdenv.cc ]
+23
pkgs/by-name/pr/presenterm/package.nix
···
···
+
{ lib, fetchFromGitHub, rustPlatform }:
+
+
rustPlatform.buildRustPackage rec {
+
pname = "presenterm";
+
version = "0.2.0";
+
+
src = fetchFromGitHub {
+
owner = "mfontanini";
+
repo = "presenterm";
+
rev = version;
+
hash = "sha256-mNWnUUezKIffh5gMgMMdvApNZZTxxB8XrL0jFLyBxuk=";
+
};
+
+
cargoHash = "sha256-JLPJLhWN/yXpPIHa+FJ2aQ/GDUFKtZ7t+/8rvR8WNKM=";
+
+
meta = with lib; {
+
description = "A terminal based slideshow tool";
+
homepage = "https://github.com/mfontanini/presenterm";
+
license = licenses.bsd2;
+
maintainers = with maintainers; [ mikaelfangel ];
+
mainProgram = "presenterm";
+
};
+
}
+2 -2
pkgs/by-name/ri/rimgo/package.nix
···
}:
buildGoModule rec {
pname = "rimgo";
-
version = "1.2.0";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "rimgo";
repo = "rimgo";
rev = "v${version}";
-
hash = "sha256-C878ABs978viVtIuv3fPn2F2anOg2GB/+f5jaCO13tc=";
};
vendorHash = "sha256-u5N7aI9RIQ3EmiyHv0qhMcKkvmpp+5G7xbzdQcbhybs=";
···
}:
buildGoModule rec {
pname = "rimgo";
+
version = "1.2.1";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "rimgo";
repo = "rimgo";
rev = "v${version}";
+
hash = "sha256-C6xixULZCDs+rIP7IWBVQNo34Yk/8j9ell2D0nUoHBg=";
};
vendorHash = "sha256-u5N7aI9RIQ3EmiyHv0qhMcKkvmpp+5G7xbzdQcbhybs=";
+2 -2
pkgs/development/libraries/libmediainfo/default.nix
···
stdenv.mkDerivation rec {
pname = "libmediainfo";
-
version = "23.09";
src = fetchurl {
url = "https://mediaarea.net/download/source/libmediainfo/${version}/libmediainfo_${version}.tar.xz";
-
hash = "sha256-HDJvFmVyrGwsHIim1Tr35FE4iEDH7r7scdWrv9G7LtM=";
};
nativeBuildInputs = [ autoreconfHook pkg-config ];
···
stdenv.mkDerivation rec {
pname = "libmediainfo";
+
version = "23.10";
src = fetchurl {
url = "https://mediaarea.net/download/source/libmediainfo/${version}/libmediainfo_${version}.tar.xz";
+
hash = "sha256-duvlAuDzELVZ1d2Qcn2ar9X6uq7KNELzjmKd/AfaDSI=";
};
nativeBuildInputs = [ autoreconfHook pkg-config ];
-36
pkgs/development/libraries/lightstep-tracer-cpp/default.nix
···
-
{ stdenv, lib, fetchFromGitHub, pkg-config, cmake
-
, opentracing-cpp, protobuf
-
, enableGrpc ? false, grpc, openssl
-
}:
-
-
stdenv.mkDerivation rec {
-
pname = "lightstep-tracer-cpp";
-
version = "0.14.0";
-
-
src = fetchFromGitHub {
-
owner = "lightstep";
-
repo = pname;
-
rev = "v${version}";
-
sha256 = "1xr11dm94qpbx3nxb7si7zy7hzg2akj01pyxkd8pzzbvmkmic16j";
-
};
-
-
nativeBuildInputs = [
-
cmake pkg-config
-
];
-
-
buildInputs = [
-
opentracing-cpp protobuf
-
] ++ lib.optionals enableGrpc [
-
grpc openssl
-
];
-
-
cmakeFlags = lib.optionals (!enableGrpc) [ "-DWITH_GRPC=OFF" ];
-
-
meta = with lib; {
-
description = "Distributed tracing system built on top of the OpenTracing standard";
-
homepage = "https://lightstep.com/";
-
license = licenses.mit;
-
platforms = platforms.linux;
-
maintainers = with maintainers; [ ];
-
};
-
}
···
+3 -3
pkgs/development/python-modules/pycatch22/default.nix
···
buildPythonPackage rec {
pname = "pycatch22";
-
version = "0.4.3";
pyproject = true;
disabled = pythonOlder "3.7";
···
owner = "DynamicsAndNeuralSystems";
repo = "pycatch22";
rev = "refs/tags/v${version}";
-
hash = "sha256-wjMklOzU9I3Y2HdZ+rOTiffoKda+6X9zwDsmB+HXrSY=";
};
nativeBuildInputs = [
···
description = "Python implementation of catch22";
homepage = "https://github.com/DynamicsAndNeuralSystems/pycatch22";
changelog = "https://github.com/DynamicsAndNeuralSystems/pycatch22/releases/tag/v${version}";
-
license = licenses.gpl3Only;
maintainers = with maintainers; [ mbalatsko ];
};
}
···
buildPythonPackage rec {
pname = "pycatch22";
+
version = "0.4.4";
pyproject = true;
disabled = pythonOlder "3.7";
···
owner = "DynamicsAndNeuralSystems";
repo = "pycatch22";
rev = "refs/tags/v${version}";
+
hash = "sha256-l41LLo9k075EL8rV48bwa4Yw12XuqNJSDYtd9kyqS3U=";
};
nativeBuildInputs = [
···
description = "Python implementation of catch22";
homepage = "https://github.com/DynamicsAndNeuralSystems/pycatch22";
changelog = "https://github.com/DynamicsAndNeuralSystems/pycatch22/releases/tag/v${version}";
+
license = licenses.gpl3Plus;
maintainers = with maintainers; [ mbalatsko ];
};
}
+5 -3
pkgs/development/tools/misc/runme/default.nix
···
, fetchFromGitHub
, installShellFiles
, nodejs
, runtimeShell
, stdenv
, testers
···
buildGo121Module rec {
pname = "runme";
-
version = "1.7.6";
src = fetchFromGitHub {
owner = "stateful";
repo = "runme";
rev = "v${version}";
-
hash = "sha256-gYaC1ROvW4wFrOKt1Wjl/ExhWX0ZQXHW6n6N70tXa+E=";
};
-
vendorHash = "sha256-/eofPpXmfpc7Vjz97hjKXH/Fl/EAk0zrnI279iit7MI=";
nativeBuildInputs = [
installShellFiles
···
nativeCheckInputs = [
nodejs
];
subPackages = [
···
, fetchFromGitHub
, installShellFiles
, nodejs
+
, python3
, runtimeShell
, stdenv
, testers
···
buildGo121Module rec {
pname = "runme";
+
version = "1.7.7";
src = fetchFromGitHub {
owner = "stateful";
repo = "runme";
rev = "v${version}";
+
hash = "sha256-ZM8gdZ26XAlC+j6U0+oQJIb+5gOGFUAYHPP82kA1ogU=";
};
+
vendorHash = "sha256-nKH4hT0J9QfrDdvovu/XNxU4PtZYKkfqEBiCTNLWyRA=";
nativeBuildInputs = [
installShellFiles
···
nativeCheckInputs = [
nodejs
+
python3
];
subPackages = [
-784
pkgs/os-specific/linux/kernel/cpu-cgroup-v2-patches/4.11.patch
···
-
commit 827b86ad1dd21feed4c0b99faf6059f245f7dadb
-
Author: Tejun Heo <tj@kernel.org>
-
Date: Fri Mar 11 07:31:23 2016 -0500
-
-
sched: Misc preps for cgroup unified hierarchy interface
-
-
Make the following changes in preparation for the cpu controller
-
interface implementation for the unified hierarchy. This patch
-
doesn't cause any functional differences.
-
-
* s/cpu_stats_show()/cpu_cfs_stats_show()/
-
-
* s/cpu_files/cpu_legacy_files/
-
-
* Separate out cpuacct_stats_read() from cpuacct_stats_show(). While
-
at it, make the @val array u64 for consistency.
-
-
Signed-off-by: Tejun Heo <tj@kernel.org>
-
Cc: Ingo Molnar <mingo@redhat.com>
-
Cc: Peter Zijlstra <peterz@infradead.org>
-
Cc: Li Zefan <lizefan@huawei.com>
-
Cc: Johannes Weiner <hannes@cmpxchg.org>
-
-
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
-
index 3b31fc05a0f1..a1b95e83fa87 100644
-
--- a/kernel/sched/core.c
-
+++ b/kernel/sched/core.c
-
@@ -7174,7 +7174,7 @@ static int __cfs_schedulable(struct task_group *tg, u64 period, u64 quota)
-
return ret;
-
}
-
-
-static int cpu_stats_show(struct seq_file *sf, void *v)
-
+static int cpu_cfs_stats_show(struct seq_file *sf, void *v)
-
{
-
struct task_group *tg = css_tg(seq_css(sf));
-
struct cfs_bandwidth *cfs_b = &tg->cfs_bandwidth;
-
@@ -7214,7 +7214,7 @@ static u64 cpu_rt_period_read_uint(struct cgroup_subsys_state *css,
-
}
-
#endif /* CONFIG_RT_GROUP_SCHED */
-
-
-static struct cftype cpu_files[] = {
-
+static struct cftype cpu_legacy_files[] = {
-
#ifdef CONFIG_FAIR_GROUP_SCHED
-
{
-
.name = "shares",
-
@@ -7235,7 +7235,7 @@ static struct cftype cpu_files[] = {
-
},
-
{
-
.name = "stat",
-
- .seq_show = cpu_stats_show,
-
+ .seq_show = cpu_cfs_stats_show,
-
},
-
#endif
-
#ifdef CONFIG_RT_GROUP_SCHED
-
@@ -7261,7 +7261,7 @@ struct cgroup_subsys cpu_cgrp_subsys = {
-
.fork = cpu_cgroup_fork,
-
.can_attach = cpu_cgroup_can_attach,
-
.attach = cpu_cgroup_attach,
-
- .legacy_cftypes = cpu_files,
-
+ .legacy_cftypes = cpu_legacy_files,
-
.early_init = true,
-
};
-
-
diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
-
index f95ab29a45d0..6151c23f722f 100644
-
--- a/kernel/sched/cpuacct.c
-
+++ b/kernel/sched/cpuacct.c
-
@@ -276,26 +276,33 @@ static int cpuacct_all_seq_show(struct seq_file *m, void *V)
-
return 0;
-
}
-
-
-static int cpuacct_stats_show(struct seq_file *sf, void *v)
-
+static void cpuacct_stats_read(struct cpuacct *ca,
-
+ u64 (*val)[CPUACCT_STAT_NSTATS])
-
{
-
- struct cpuacct *ca = css_ca(seq_css(sf));
-
- s64 val[CPUACCT_STAT_NSTATS];
-
int cpu;
-
- int stat;
-
-
- memset(val, 0, sizeof(val));
-
+ memset(val, 0, sizeof(*val));
-
+
-
for_each_possible_cpu(cpu) {
-
u64 *cpustat = per_cpu_ptr(ca->cpustat, cpu)->cpustat;
-
-
- val[CPUACCT_STAT_USER] += cpustat[CPUTIME_USER];
-
- val[CPUACCT_STAT_USER] += cpustat[CPUTIME_NICE];
-
- val[CPUACCT_STAT_SYSTEM] += cpustat[CPUTIME_SYSTEM];
-
- val[CPUACCT_STAT_SYSTEM] += cpustat[CPUTIME_IRQ];
-
- val[CPUACCT_STAT_SYSTEM] += cpustat[CPUTIME_SOFTIRQ];
-
+ (*val)[CPUACCT_STAT_USER] += cpustat[CPUTIME_USER];
-
+ (*val)[CPUACCT_STAT_USER] += cpustat[CPUTIME_NICE];
-
+ (*val)[CPUACCT_STAT_SYSTEM] += cpustat[CPUTIME_SYSTEM];
-
+ (*val)[CPUACCT_STAT_SYSTEM] += cpustat[CPUTIME_IRQ];
-
+ (*val)[CPUACCT_STAT_SYSTEM] += cpustat[CPUTIME_SOFTIRQ];
-
}
-
+}
-
+
-
+static int cpuacct_stats_show(struct seq_file *sf, void *v)
-
+{
-
+ u64 val[CPUACCT_STAT_NSTATS];
-
+ int stat;
-
+
-
+ cpuacct_stats_read(css_ca(seq_css(sf)), &val);
-
-
for (stat = 0; stat < CPUACCT_STAT_NSTATS; stat++) {
-
- seq_printf(sf, "%s %lld\n",
-
+ seq_printf(sf, "%s %llu\n",
-
cpuacct_stat_desc[stat],
-
(long long)nsec_to_clock_t(val[stat]));
-
}
-
-
commit fdb64d002b3a223ce4bb11aa4448a42050470052
-
Author: Tejun Heo <tj@kernel.org>
-
Date: Fri Mar 11 07:31:23 2016 -0500
-
-
sched: Implement interface for cgroup unified hierarchy
-
-
While the cpu controller doesn't have any functional problems, there
-
are a couple interface issues which can be addressed in the v2
-
interface.
-
-
* cpuacct being a separate controller. This separation is artificial
-
and rather pointless as demonstrated by most use cases co-mounting
-
the two controllers. It also forces certain information to be
-
accounted twice.
-
-
* Use of different time units. Writable control knobs use
-
microseconds, some stat fields use nanoseconds while other cpuacct
-
stat fields use centiseconds.
-
-
* Control knobs which can't be used in the root cgroup still show up
-
in the root.
-
-
* Control knob names and semantics aren't consistent with other
-
controllers.
-
-
This patchset implements cpu controller's interface on the unified
-
hierarchy which adheres to the controller file conventions described
-
in Documentation/cgroups/unified-hierarchy.txt. Overall, the
-
following changes are made.
-
-
* cpuacct is implictly enabled and disabled by cpu and its information
-
is reported through "cpu.stat" which now uses microseconds for all
-
time durations. All time duration fields now have "_usec" appended
-
to them for clarity. While this doesn't solve the double accounting
-
immediately, once majority of users switch to v2, cpu can directly
-
account and report the relevant stats and cpuacct can be disabled on
-
the unified hierarchy.
-
-
Note that cpuacct.usage_percpu is currently not included in
-
"cpu.stat". If this information is actually called for, it can be
-
added later.
-
-
* "cpu.shares" is replaced with "cpu.weight" and operates on the
-
standard scale defined by CGROUP_WEIGHT_MIN/DFL/MAX (1, 100, 10000).
-
The weight is scaled to scheduler weight so that 100 maps to 1024
-
and the ratio relationship is preserved - if weight is W and its
-
scaled value is S, W / 100 == S / 1024. While the mapped range is a
-
bit smaller than the orignal scheduler weight range, the dead zones
-
on both sides are relatively small and covers wider range than the
-
nice value mappings. This file doesn't make sense in the root
-
cgroup and isn't create on root.
-
-
* "cpu.cfs_quota_us" and "cpu.cfs_period_us" are replaced by "cpu.max"
-
which contains both quota and period.
-
-
* "cpu.rt_runtime_us" and "cpu.rt_period_us" are replaced by
-
"cpu.rt.max" which contains both runtime and period.
-
-
v2: cpu_stats_show() was incorrectly using CONFIG_FAIR_GROUP_SCHED for
-
CFS bandwidth stats and also using raw division for u64. Use
-
CONFIG_CFS_BANDWITH and do_div() instead.
-
-
The semantics of "cpu.rt.max" is not fully decided yet. Dropped
-
for now.
-
-
Signed-off-by: Tejun Heo <tj@kernel.org>
-
Cc: Ingo Molnar <mingo@redhat.com>
-
Cc: Peter Zijlstra <peterz@infradead.org>
-
Cc: Li Zefan <lizefan@huawei.com>
-
Cc: Johannes Weiner <hannes@cmpxchg.org>
-
-
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
-
index a1b95e83fa87..f01d56e58a1b 100644
-
--- a/kernel/sched/core.c
-
+++ b/kernel/sched/core.c
-
@@ -7253,6 +7253,139 @@ static struct cftype cpu_legacy_files[] = {
-
{ } /* Terminate */
-
};
-
-
+static int cpu_stats_show(struct seq_file *sf, void *v)
-
+{
-
+ cpuacct_cpu_stats_show(sf);
-
+
-
+#ifdef CONFIG_CFS_BANDWIDTH
-
+ {
-
+ struct task_group *tg = css_tg(seq_css(sf));
-
+ struct cfs_bandwidth *cfs_b = &tg->cfs_bandwidth;
-
+ u64 throttled_usec;
-
+
-
+ throttled_usec = cfs_b->throttled_time;
-
+ do_div(throttled_usec, NSEC_PER_USEC);
-
+
-
+ seq_printf(sf, "nr_periods %d\n"
-
+ "nr_throttled %d\n"
-
+ "throttled_usec %llu\n",
-
+ cfs_b->nr_periods, cfs_b->nr_throttled,
-
+ throttled_usec);
-
+ }
-
+#endif
-
+ return 0;
-
+}
-
+
-
+#ifdef CONFIG_FAIR_GROUP_SCHED
-
+static u64 cpu_weight_read_u64(struct cgroup_subsys_state *css,
-
+ struct cftype *cft)
-
+{
-
+ struct task_group *tg = css_tg(css);
-
+ u64 weight = scale_load_down(tg->shares);
-
+
-
+ return DIV_ROUND_CLOSEST_ULL(weight * CGROUP_WEIGHT_DFL, 1024);
-
+}
-
+
-
+static int cpu_weight_write_u64(struct cgroup_subsys_state *css,
-
+ struct cftype *cftype, u64 weight)
-
+{
-
+ /*
-
+ * cgroup weight knobs should use the common MIN, DFL and MAX
-
+ * values which are 1, 100 and 10000 respectively. While it loses
-
+ * a bit of range on both ends, it maps pretty well onto the shares
-
+ * value used by scheduler and the round-trip conversions preserve
-
+ * the original value over the entire range.
-
+ */
-
+ if (weight < CGROUP_WEIGHT_MIN || weight > CGROUP_WEIGHT_MAX)
-
+ return -ERANGE;
-
+
-
+ weight = DIV_ROUND_CLOSEST_ULL(weight * 1024, CGROUP_WEIGHT_DFL);
-
+
-
+ return sched_group_set_shares(css_tg(css), scale_load(weight));
-
+}
-
+#endif
-
+
-
+static void __maybe_unused cpu_period_quota_print(struct seq_file *sf,
-
+ long period, long quota)
-
+{
-
+ if (quota < 0)
-
+ seq_puts(sf, "max");
-
+ else
-
+ seq_printf(sf, "%ld", quota);
-
+
-
+ seq_printf(sf, " %ld\n", period);
-
+}
-
+
-
+/* caller should put the current value in *@periodp before calling */
-
+static int __maybe_unused cpu_period_quota_parse(char *buf,
-
+ u64 *periodp, u64 *quotap)
-
+{
-
+ char tok[21]; /* U64_MAX */
-
+
-
+ if (!sscanf(buf, "%s %llu", tok, periodp))
-
+ return -EINVAL;
-
+
-
+ *periodp *= NSEC_PER_USEC;
-
+
-
+ if (sscanf(tok, "%llu", quotap))
-
+ *quotap *= NSEC_PER_USEC;
-
+ else if (!strcmp(tok, "max"))
-
+ *quotap = RUNTIME_INF;
-
+ else
-
+ return -EINVAL;
-
+
-
+ return 0;
-
+}
-
+
-
+#ifdef CONFIG_CFS_BANDWIDTH
-
+static int cpu_max_show(struct seq_file *sf, void *v)
-
+{
-
+ struct task_group *tg = css_tg(seq_css(sf));
-
+
-
+ cpu_period_quota_print(sf, tg_get_cfs_period(tg), tg_get_cfs_quota(tg));
-
+ return 0;
-
+}
-
+
-
+static ssize_t cpu_max_write(struct kernfs_open_file *of,
-
+ char *buf, size_t nbytes, loff_t off)
-
+{
-
+ struct task_group *tg = css_tg(of_css(of));
-
+ u64 period = tg_get_cfs_period(tg);
-
+ u64 quota;
-
+ int ret;
-
+
-
+ ret = cpu_period_quota_parse(buf, &period, &quota);
-
+ if (!ret)
-
+ ret = tg_set_cfs_bandwidth(tg, period, quota);
-
+ return ret ?: nbytes;
-
+}
-
+#endif
-
+
-
+static struct cftype cpu_files[] = {
-
+ {
-
+ .name = "stat",
-
+ .flags = CFTYPE_NOT_ON_ROOT,
-
+ .seq_show = cpu_stats_show,
-
+ },
-
+#ifdef CONFIG_FAIR_GROUP_SCHED
-
+ {
-
+ .name = "weight",
-
+ .flags = CFTYPE_NOT_ON_ROOT,
-
+ .read_u64 = cpu_weight_read_u64,
-
+ .write_u64 = cpu_weight_write_u64,
-
+ },
-
+#endif
-
+#ifdef CONFIG_CFS_BANDWIDTH
-
+ {
-
+ .name = "max",
-
+ .flags = CFTYPE_NOT_ON_ROOT,
-
+ .seq_show = cpu_max_show,
-
+ .write = cpu_max_write,
-
+ },
-
+#endif
-
+ { } /* terminate */
-
+};
-
+
-
struct cgroup_subsys cpu_cgrp_subsys = {
-
.css_alloc = cpu_cgroup_css_alloc,
-
.css_online = cpu_cgroup_css_online,
-
@@ -7262,7 +7395,15 @@ struct cgroup_subsys cpu_cgrp_subsys = {
-
.can_attach = cpu_cgroup_can_attach,
-
.attach = cpu_cgroup_attach,
-
.legacy_cftypes = cpu_legacy_files,
-
+ .dfl_cftypes = cpu_files,
-
.early_init = true,
-
+#ifdef CONFIG_CGROUP_CPUACCT
-
+ /*
-
+ * cpuacct is enabled together with cpu on the unified hierarchy
-
+ * and its stats are reported through "cpu.stat".
-
+ */
-
+ .depends_on = 1 << cpuacct_cgrp_id,
-
+#endif
-
};
-
-
#endif /* CONFIG_CGROUP_SCHED */
-
diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
-
index 6151c23f722f..fc1cf13c3af1 100644
-
--- a/kernel/sched/cpuacct.c
-
+++ b/kernel/sched/cpuacct.c
-
@@ -347,6 +347,31 @@ static struct cftype files[] = {
-
{ } /* terminate */
-
};
-
-
+/* used to print cpuacct stats in cpu.stat on the unified hierarchy */
-
+void cpuacct_cpu_stats_show(struct seq_file *sf)
-
+{
-
+ struct cgroup_subsys_state *css;
-
+ u64 usage, val[CPUACCT_STAT_NSTATS];
-
+
-
+ css = cgroup_get_e_css(seq_css(sf)->cgroup, &cpuacct_cgrp_subsys);
-
+
-
+ usage = cpuusage_read(css, seq_cft(sf));
-
+ cpuacct_stats_read(css_ca(css), &val);
-
+
-
+ val[CPUACCT_STAT_USER] *= TICK_NSEC;
-
+ val[CPUACCT_STAT_SYSTEM] *= TICK_NSEC;
-
+ do_div(usage, NSEC_PER_USEC);
-
+ do_div(val[CPUACCT_STAT_USER], NSEC_PER_USEC);
-
+ do_div(val[CPUACCT_STAT_SYSTEM], NSEC_PER_USEC);
-
+
-
+ seq_printf(sf, "usage_usec %llu\n"
-
+ "user_usec %llu\n"
-
+ "system_usec %llu\n",
-
+ usage, val[CPUACCT_STAT_USER], val[CPUACCT_STAT_SYSTEM]);
-
+
-
+ css_put(css);
-
+}
-
+
-
/*
-
* charge this task's execution time to its accounting group.
-
*
-
diff --git a/kernel/sched/cpuacct.h b/kernel/sched/cpuacct.h
-
index ba72807c73d4..ddf7af466d35 100644
-
--- a/kernel/sched/cpuacct.h
-
+++ b/kernel/sched/cpuacct.h
-
@@ -2,6 +2,7 @@
-
-
extern void cpuacct_charge(struct task_struct *tsk, u64 cputime);
-
extern void cpuacct_account_field(struct task_struct *tsk, int index, u64 val);
-
+extern void cpuacct_cpu_stats_show(struct seq_file *sf);
-
-
#else
-
-
@@ -14,4 +15,8 @@ cpuacct_account_field(struct task_struct *tsk, int index, u64 val)
-
{
-
}
-
-
+static inline void cpuacct_cpu_stats_show(struct seq_file *sf)
-
+{
-
+}
-
+
-
#endif
-
-
commit 8dde150866b8c433216105c50b7e889d5242d583
-
Author: Tejun Heo <tj@kernel.org>
-
Date: Fri Aug 5 12:41:01 2016 -0400
-
-
cgroup: add documentation regarding CPU controller cgroup v2 support
-
-
Signed-off-by: Tejun Heo <tj@kernel.org>
-
-
diff --git a/Documentation/cgroup-v2-cpu.txt b/Documentation/cgroup-v2-cpu.txt
-
new file mode 100644
-
index 000000000000..1ed7032d4472
-
--- /dev/null
-
+++ b/Documentation/cgroup-v2-cpu.txt
-
@@ -0,0 +1,368 @@
-
+
-
+
-
+CPU Controller on Control Group v2
-
+
-
+August, 2016 Tejun Heo <tj@kernel.org>
-
+
-
+
-
+While most controllers have support for cgroup v2 now, the CPU
-
+controller support is not upstream yet due to objections from the
-
+scheduler maintainers on the basic designs of cgroup v2. This
-
+document explains the current situation as well as an interim
-
+solution, and details the disagreements and arguments. The latest
-
+version of this document can be found at the following URL.
-
+
-
+ https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/tree/Documentation/cgroup-v2-cpu.txt?h=cgroup-v2-cpu
-
+
-
+This document was posted to the linux-kernel and cgroup mailing lists.
-
+Unfortunately, no consensus was reached as of Oct, 2016. The thread
-
+can be found at the following URL.
-
+
-
+ http://lkml.kernel.org/r/20160805170752.GK2542@mtj.duckdns.org
-
+
-
+
-
+CONTENTS
-
+
-
+1. Current Situation and Interim Solution
-
+2. Disagreements and Arguments
-
+ 2-1. Contentious Restrictions
-
+ 2-1-1. Process Granularity
-
+ 2-1-2. No Internal Process Constraint
-
+ 2-2. Impact on CPU Controller
-
+ 2-2-1. Impact of Process Granularity
-
+ 2-2-2. Impact of No Internal Process Constraint
-
+ 2-3. Arguments for cgroup v2
-
+3. Way Forward
-
+4. References
-
+
-
+
-
+1. Current Situation and Interim Solution
-
+
-
+All objections from the scheduler maintainers apply to cgroup v2 core
-
+design, and there are no known objections to the specifics of the CPU
-
+controller cgroup v2 interface. The only blocked part is changes to
-
+expose the CPU controller interface on cgroup v2, which comprises the
-
+following two patches:
-
+
-
+ [1] sched: Misc preps for cgroup unified hierarchy interface
-
+ [2] sched: Implement interface for cgroup unified hierarchy
-
+
-
+The necessary changes are superficial and implement the interface
-
+files on cgroup v2. The combined diffstat is as follows.
-
+
-
+ kernel/sched/core.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++--
-
+ kernel/sched/cpuacct.c | 57 ++++++++++++------
-
+ kernel/sched/cpuacct.h | 5 +
-
+ 3 files changed, 189 insertions(+), 22 deletions(-)
-
+
-
+The patches are easy to apply and forward-port. The following git
-
+branch will always carry the two patches on top of the latest release
-
+of the upstream kernel.
-
+
-
+ git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/cgroup-v2-cpu
-
+
-
+There also are versioned branches going back to v4.4.
-
+
-
+ git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/cgroup-v2-cpu-$KERNEL_VER
-
+
-
+While it's difficult to tell whether the CPU controller support will
-
+be merged, there are crucial resource control features in cgroup v2
-
+that are only possible due to the design choices that are being
-
+objected to, and every effort will be made to ease enabling the CPU
-
+controller cgroup v2 support out-of-tree for parties which choose to.
-
+
-
+
-
+2. Disagreements and Arguments
-
+
-
+There have been several lengthy discussion threads [3][4] on LKML
-
+around the structural constraints of cgroup v2. The two that affect
-
+the CPU controller are process granularity and no internal process
-
+constraint. Both arise primarily from the need for common resource
-
+domain definition across different resources.
-
+
-
+The common resource domain is a powerful concept in cgroup v2 that
-
+allows controllers to make basic assumptions about the structural
-
+organization of processes and controllers inside the cgroup hierarchy,
-
+and thus solve problems spanning multiple types of resources. The
-
+prime example for this is page cache writeback: dirty page cache is
-
+regulated through throttling buffered writers based on memory
-
+availability, and initiating batched write outs to the disk based on
-
+IO capacity. Tracking and controlling writeback inside a cgroup thus
-
+requires the direct cooperation of the memory and the IO controller.
-
+
-
+This easily extends to other areas, such as CPU cycles consumed while
-
+performing memory reclaim or IO encryption.
-
+
-
+
-
+2-1. Contentious Restrictions
-
+
-
+For controllers of different resources to work together, they must
-
+agree on a common organization. This uniform model across controllers
-
+imposes two contentious restrictions on the CPU controller: process
-
+granularity and the no-internal-process constraint.
-
+
-
+
-
+ 2-1-1. Process Granularity
-
+
-
+ For memory, because an address space is shared between all threads
-
+ of a process, the terminal consumer is a process, not a thread.
-
+ Separating the threads of a single process into different memory
-
+ control domains doesn't make semantical sense. cgroup v2 ensures
-
+ that all controller can agree on the same organization by requiring
-
+ that threads of the same process belong to the same cgroup.
-
+
-
+ There are other reasons to enforce process granularity. One
-
+ important one is isolating system-level management operations from
-
+ in-process application operations. The cgroup interface, being a
-
+ virtual filesystem, is very unfit for multiple independent
-
+ operations taking place at the same time as most operations have to
-
+ be multi-step and there is no way to synchronize multiple accessors.
-
+ See also [5] Documentation/cgroup-v2.txt, "R-2. Thread Granularity"
-
+
-
+
-
+ 2-1-2. No Internal Process Constraint
-
+
-
+ cgroup v2 does not allow processes to belong to any cgroup which has
-
+ child cgroups when resource controllers are enabled on it (the
-
+ notable exception being the root cgroup itself). This is because,
-
+ for some resources, a resource domain (cgroup) is not directly
-
+ comparable to the terminal consumer (process/task) of said resource,
-
+ and so putting the two into a sibling relationship isn't meaningful.
-
+
-
+ - Differing Control Parameters and Capabilities
-
+
-
+ A cgroup controller has different resource control parameters and
-
+ capabilities from a terminal consumer, be that a task or process.
-
+ There are a couple cases where a cgroup control knob can be mapped
-
+ to a per-task or per-process API but they are exceptions and the
-
+ mappings aren't obvious even in those cases.
-
+
-
+ For example, task priorities (also known as nice values) set
-
+ through setpriority(2) are mapped to the CPU controller
-
+ "cpu.shares" values. However, how exactly the two ranges map and
-
+ even the fact that they map to each other at all are not obvious.
-
+
-
+ The situation gets further muddled when considering other resource
-
+ types and control knobs. IO priorities set through ioprio_set(2)
-
+ cannot be mapped to IO controller weights and most cgroup resource
-
+ control knobs including the bandwidth control knobs of the CPU
-
+ controller don't have counterparts in the terminal consumers.
-
+
-
+ - Anonymous Resource Consumption
-
+
-
+ For CPU, every time slice consumed from inside a cgroup, which
-
+ comprises most but not all of consumed CPU time for the cgroup,
-
+ can be clearly attributed to a specific task or process. Because
-
+ these two types of entities are directly comparable as consumers
-
+ of CPU time, it's theoretically possible to mix tasks and cgroups
-
+ on the same tree levels and let them directly compete for the time
-
+ quota available to their common ancestor.
-
+
-
+ However, the same can't be said for resource types like memory or
-
+ IO: the memory consumed by the page cache, for example, can be
-
+ tracked on a per-cgroup level, but due to mismatches in lifetimes
-
+ of involved objects (page cache can persist long after processes
-
+ are gone), shared usages and the implementation overhead of
-
+ tracking persistent state, it can no longer be attributed to
-
+ individual processes after instantiation. Consequently, any IO
-
+ incurred by page cache writeback can be attributed to a cgroup,
-
+ but not to the individual consumers inside the cgroup.
-
+
-
+ For memory and IO, this makes a resource domain (cgroup) an object
-
+ of a fundamentally different type than a terminal consumer
-
+ (process). A process can't be a first class object in the resource
-
+ distribution graph as its total resource consumption can't be
-
+ described without the containing resource domain.
-
+
-
+ Disallowing processes in internal cgroups avoids competition between
-
+ cgroups and processes which cannot be meaningfully defined for these
-
+ resources. All resource control takes place among cgroups and a
-
+ terminal consumer interacts with the containing cgroup the same way
-
+ it would with the system without cgroup.
-
+
-
+ Root cgroup is exempt from this constraint, which is in line with
-
+ how root cgroup is handled in general - it's excluded from cgroup
-
+ resource accounting and control.
-
+
-
+
-
+Enforcing process granularity and no internal process constraint
-
+allows all controllers to be on the same footing in terms of resource
-
+distribution hierarchy.
-
+
-
+
-
+2-2. Impact on CPU Controller
-
+
-
+As indicated earlier, the CPU controller's resource distribution graph
-
+is the simplest. Every schedulable resource consumption can be
-
+attributed to a specific task. In addition, for weight based control,
-
+the per-task priority set through setpriority(2) can be translated to
-
+and from a per-cgroup weight. As such, the CPU controller can treat a
-
+task and a cgroup symmetrically, allowing support for any tree layout
-
+of cgroups and tasks. Both process granularity and the no internal
-
+process constraint restrict how the CPU controller can be used.
-
+
-
+
-
+ 2-2-1. Impact of Process Granularity
-
+
-
+ Process granularity prevents tasks belonging to the same process to
-
+ be assigned to different cgroups. It was pointed out [6] that this
-
+ excludes the valid use case of hierarchical CPU distribution within
-
+ processes.
-
+
-
+ To address this issue, the rgroup (resource group) [7][8][9]
-
+ interface, an extension of the existing setpriority(2) API, was
-
+ proposed, which is in line with other programmable priority
-
+ mechanisms and eliminates the risk of in-application configuration
-
+ and system configuration stepping on each other's toes.
-
+ Unfortunately, the proposal quickly turned into discussions around
-
+ cgroup v2 design decisions [4] and no consensus could be reached.
-
+
-
+
-
+ 2-2-2. Impact of No Internal Process Constraint
-
+
-
+ The no internal process constraint disallows tasks from competing
-
+ directly against cgroups. Here is an excerpt from Peter Zijlstra
-
+ pointing out the issue [10] - R, L and A are cgroups; t1, t2, t3 and
-
+ t4 are tasks:
-
+
-
+
-
+ R
-
+ / | \
-
+ t1 t2 A
-
+ / \
-
+ t3 t4
-
+
-
+
-
+ Is fundamentally different from:
-
+
-
+
-
+ R
-
+ / \
-
+ L A
-
+ / \ / \
-
+ t1 t2 t3 t4
-
+
-
+
-
+ Because if in the first hierarchy you add a task (t5) to R, all of
-
+ its A will run at 1/4th of total bandwidth where before it had
-
+ 1/3rd, whereas with the second example, if you add our t5 to L, A
-
+ doesn't get any less bandwidth.
-
+
-
+
-
+ It is true that the trees are semantically different from each other
-
+ and the symmetric handling of tasks and cgroups is aesthetically
-
+ pleasing. However, it isn't clear what the practical usefulness of
-
+ a layout with direct competition between tasks and cgroups would be,
-
+ considering that number and behavior of tasks are controlled by each
-
+ application, and cgroups primarily deal with system level resource
-
+ distribution; changes in the number of active threads would directly
-
+ impact resource distribution. Real world use cases of such layouts
-
+ could not be established during the discussions.
-
+
-
+
-
+2-3. Arguments for cgroup v2
-
+
-
+There are strong demands for comprehensive hierarchical resource
-
+control across all major resources, and establishing a common resource
-
+hierarchy is an essential step. As with most engineering decisions,
-
+common resource hierarchy definition comes with its trade-offs. With
-
+cgroup v2, the trade-offs are in the form of structural constraints
-
+which, among others, restrict the CPU controller's space of possible
-
+configurations.
-
+
-
+However, even with the restrictions, cgroup v2, in combination with
-
+rgroup, covers most of identified real world use cases while enabling
-
+new important use cases of resource control across multiple resource
-
+types that were fundamentally broken previously.
-
+
-
+Furthermore, for resource control, treating resource domains as
-
+objects of a different type from terminal consumers has important
-
+advantages - it can account for resource consumptions which are not
-
+tied to any specific terminal consumer, be that a task or process, and
-
+allows decoupling resource distribution controls from in-application
-
+APIs. Even the CPU controller may benefit from it as the kernel can
-
+consume significant amount of CPU cycles in interrupt context or tasks
-
+shared across multiple resource domains (e.g. softirq).
-
+
-
+Finally, it's important to note that enabling cgroup v2 support for
-
+the CPU controller doesn't block use cases which require the features
-
+which are not available on cgroup v2. Unlikely, but should anybody
-
+actually rely on the CPU controller's symmetric handling of tasks and
-
+cgroups, backward compatibility is and will be maintained by being
-
+able to disconnect the controller from the cgroup v2 hierarchy and use
-
+it standalone. This also holds for cpuset which is often used in
-
+highly customized configurations which might be a poor fit for common
-
+resource domains.
-
+
-
+The required changes are minimal, the benefits for the target use
-
+cases are critical and obvious, and use cases which have to use v1 can
-
+continue to do so.
-
+
-
+
-
+3. Way Forward
-
+
-
+cgroup v2 primarily aims to solve the problem of comprehensive
-
+hierarchical resource control across all major computing resources,
-
+which is one of the core problems of modern server infrastructure
-
+engineering. The trade-offs that cgroup v2 took are results of
-
+pursuing that goal and gaining a better understanding of the nature of
-
+resource control in the process.
-
+
-
+I believe that real world usages will prove cgroup v2's model right,
-
+considering the crucial pieces of comprehensive resource control that
-
+cannot be implemented without common resource domains. This is not to
-
+say that cgroup v2 is fixed in stone and can't be updated; if there is
-
+an approach which better serves both comprehensive resource control
-
+and the CPU controller's flexibility, we will surely move towards
-
+that. It goes without saying that discussions around such approach
-
+should consider practical aspects of resource control as a whole
-
+rather than absolutely focusing on a particular controller.
-
+
-
+Until such consensus can be reached, the CPU controller cgroup v2
-
+support will be maintained out of the mainline kernel in an easily
-
+accessible form. If there is anything cgroup developers can do to
-
+ease the pain, please feel free to contact us on the cgroup mailing
-
+list at cgroups@vger.kernel.org.
-
+
-
+
-
+4. References
-
+
-
+[1] http://lkml.kernel.org/r/20160105164834.GE5995@mtj.duckdns.org
-
+ [PATCH 1/2] sched: Misc preps for cgroup unified hierarchy interface
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[2] http://lkml.kernel.org/r/20160105164852.GF5995@mtj.duckdns.org
-
+ [PATCH 2/2] sched: Implement interface for cgroup unified hierarchy
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[3] http://lkml.kernel.org/r/1438641689-14655-4-git-send-email-tj@kernel.org
-
+ [PATCH 3/3] sched: Implement interface for cgroup unified hierarchy
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[4] http://lkml.kernel.org/r/20160407064549.GH3430@twins.programming.kicks-ass.net
-
+ Re: [PATCHSET RFC cgroup/for-4.6] cgroup, sched: implement resource group and PRIO_RGRP
-
+ Peter Zijlstra <peterz@infradead.org>
-
+
-
+[5] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/cgroup-v2.txt
-
+ Control Group v2
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[6] http://lkml.kernel.org/r/CAPM31RJNy3jgG=DYe6GO=wyL4BPPxwUm1f2S6YXacQmo7viFZA@mail.gmail.com
-
+ Re: [PATCH 3/3] sched: Implement interface for cgroup unified hierarchy
-
+ Paul Turner <pjt@google.com>
-
+
-
+[7] http://lkml.kernel.org/r/20160105154503.GC5995@mtj.duckdns.org
-
+ [RFD] cgroup: thread granularity support for cpu controller
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[8] http://lkml.kernel.org/r/1457710888-31182-1-git-send-email-tj@kernel.org
-
+ [PATCHSET RFC cgroup/for-4.6] cgroup, sched: implement resource group and PRIO_RGRP
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[9] http://lkml.kernel.org/r/20160311160522.GA24046@htj.duckdns.org
-
+ Example program for PRIO_RGRP
-
+ Tejun Heo <tj@kernel.org>
-
+
-
+[10] http://lkml.kernel.org/r/20160407082810.GN3430@twins.programming.kicks-ass.net
-
+ Re: [PATCHSET RFC cgroup/for-4.6] cgroup, sched: implement resource
-
+ Peter Zijlstra <peterz@infradead.org>
···
-21
pkgs/os-specific/linux/kernel/cpu-cgroup-v2-patches/README.md
···
-
Patches for CPU Controller on Control Group v2
-
===============================================
-
-
See Tejun Heo's [explanation][1] for why these patches are currently
-
out-of-tree.
-
-
Generating the patches
-
-----------------------
-
-
In a linux checkout, with remote tc-cgroup pointing to
-
git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git, your
-
nixpkgs checkout in the same directory as your linux checkout (or
-
modify the command accordingly), and setting `ver` to the appropriate
-
version:
-
-
```shell
-
$ ver=4.7
-
$ git log --reverse --patch v$ver..remotes/tc-cgroup/cgroup-v2-cpu-v$ver > ../nixpkgs/pkgs/os-specific/linux/kernel/cpu-cgroup-v2-patches/$ver.patch
-
```
-
-
[1]: https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/tree/Documentation/cgroup-v2-cpu.txt?h=cgroup-v2-cpu
···
-11
pkgs/os-specific/linux/kernel/cpu-cgroup-v2-patches/default.nix
···
-
let
-
ents = builtins.readDir ./.;
-
in builtins.listToAttrs (builtins.filter (x: x != null) (map (name: let
-
match = builtins.match "(.*)\\.patch" name;
-
in if match == null then null else {
-
name = builtins.head match;
-
value = {
-
name = "cpu-cgroup-v2-${name}";
-
patch = ./. + "/${name}";
-
};
-
}) (builtins.attrNames ents)))
···
-41
pkgs/os-specific/linux/kernel/linux-hardkernel-4.14.nix
···
-
{ buildPackages, fetchFromGitHub, fetchurl, perl, buildLinux, libelf, util-linux, kernelPatches ? [], ... } @ args:
-
-
buildLinux (args // rec {
-
version = "4.14.180-176";
-
-
# modDirVersion needs to be x.y.z.
-
modDirVersion = "4.14.180";
-
-
# branchVersion needs to be x.y.
-
extraMeta.branch = "4.14";
-
-
src = fetchFromGitHub {
-
owner = "hardkernel";
-
repo = "linux";
-
rev = version;
-
sha256 = "0n7i7a2bkrm9p1wfr20h54cqm32fbjvwyn703r6zm1f6ivqhk43v";
-
};
-
-
kernelPatches = args.kernelPatches ++ [{
-
name = "usbip-tools-fno-common";
-
patch = fetchurl {
-
url = "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=d5efc2e6b98fe661dbd8dd0d5d5bfb961728e57a";
-
hash = "sha256-1CXYCV5zMLA4YdbCr8cO2N4CHEDzQChS9qbKYHPm3U4=";
-
};
-
}];
-
-
defconfig = "odroidxu4_defconfig";
-
-
# This extraConfig is (only) required because the gator module fails to build as-is.
-
extraConfig = ''
-
-
GATOR n
-
-
# This attempted fix applies correctly but does not fix the build.
-
#GATOR_MALI_MIDGARD_PATH ${src}/drivers/gpu/arm/midgard
-
-
'' + (args.extraConfig or "");
-
-
extraMeta.platforms = [ "armv7l-linux" ];
-
-
} // (args.argsOverride or {}))
···
-2
pkgs/os-specific/linux/kernel/patches.nix
···
patch = ./modinst-arg-list-too-long.patch;
};
-
cpu-cgroup-v2 = import ./cpu-cgroup-v2-patches;
-
hardened = let
mkPatch = kernelVersion: { version, sha256, patch }: let src = patch; in {
name = lib.removeSuffix ".patch" src.name;
···
patch = ./modinst-arg-list-too-long.patch;
};
hardened = let
mkPatch = kernelVersion: { version, sha256, patch }: let src = patch; in {
name = lib.removeSuffix ".patch" src.name;
+3 -3
pkgs/tools/package-management/nix-du/default.nix
···
rustPlatform.buildRustPackage rec {
pname = "nix-du";
-
version = "1.0.0";
src = fetchFromGitHub {
owner = "symphorien";
repo = "nix-du";
rev = "v${version}";
-
sha256 = "sha256-JU0kXMS4vCMdm3nOJM92Bit16141iuBnjRaV+HXiReQ=";
};
-
cargoSha256 = "sha256-DX0jpp1ujaeesW7iQWZ5/xAzGndOQqBmQZbBpMEI9u0=";
doCheck = true;
nativeCheckInputs = [ nix graphviz ];
···
rustPlatform.buildRustPackage rec {
pname = "nix-du";
+
version = "1.1.0";
src = fetchFromGitHub {
owner = "symphorien";
repo = "nix-du";
rev = "v${version}";
+
sha256 = "sha256-Ft0j9kcR5HTSX0K09OKZMIUz25PR/isqZQIKmlNjqNE=";
};
+
cargoSha256 = "sha256-x+NONRKF7b0tADG2flgBKo32wx/TyXm7Z0bd9ZbbES8=";
doCheck = true;
nativeCheckInputs = [ nix graphviz ];
+2 -1
pkgs/top-level/aliases.nix
···
angelfish = libsForQt5.kdeGear.angelfish; # Added 2021-10-06
ansible_2_12 = throw "Ansible 2.12 goes end of life in 2023/05 and can't be supported throughout the 23.05 release cycle"; # Added 2023-05-16
antimicroX = antimicrox; # Added 2021-10-31
aseprite-unfree = aseprite; # Added 2023-08-26
asls = throw "asls has been removed: abandoned by upstream"; # Added 2023-03-16
asterisk_16 = throw "asterisk_16: Asterisk 16 is end of life and has been removed"; # Added 2023-04-19
···
libyamlcpp_0_3 = yaml-cpp_0_3; # Added 2023-01-29
libxkbcommon_7 = throw "libxkbcommon_7 has been removed because it is impacted by security issues and not used in nixpkgs, move to 'libxkbcommon'"; # Added 2023-01-03
lightdm_gtk_greeter = lightdm-gtk-greeter; # Added 2022-08-01
llama = walk; # Added 2023-01-23
# Linux kernels
···
linuxPackages_6_3 = linuxKernel.packages.linux_6_3;
linuxPackages_6_4 = linuxKernel.packages.linux_6_4;
linuxPackages_6_5 = linuxKernel.packages.linux_6_5;
-
linuxPackages_hardkernel_4_14 = linuxKernel.packages.hardkernel_4_14;
linuxPackages_rpi0 = linuxKernel.packages.linux_rpi1;
linuxPackages_rpi02w = linuxKernel.packages.linux_rpi3;
linuxPackages_rpi1 = linuxKernel.packages.linux_rpi1;
···
angelfish = libsForQt5.kdeGear.angelfish; # Added 2021-10-06
ansible_2_12 = throw "Ansible 2.12 goes end of life in 2023/05 and can't be supported throughout the 23.05 release cycle"; # Added 2023-05-16
antimicroX = antimicrox; # Added 2021-10-31
+
ardour_6 = throw "ardour_6 has been removed in favor of newer versions"; # Added 2023-10-13
aseprite-unfree = aseprite; # Added 2023-08-26
asls = throw "asls has been removed: abandoned by upstream"; # Added 2023-03-16
asterisk_16 = throw "asterisk_16: Asterisk 16 is end of life and has been removed"; # Added 2023-04-19
···
libyamlcpp_0_3 = yaml-cpp_0_3; # Added 2023-01-29
libxkbcommon_7 = throw "libxkbcommon_7 has been removed because it is impacted by security issues and not used in nixpkgs, move to 'libxkbcommon'"; # Added 2023-01-03
lightdm_gtk_greeter = lightdm-gtk-greeter; # Added 2022-08-01
+
lightstep-tracer-cpp = throw "lightstep-tracer-cpp is deprecated since 2022-08-29; the upstream recommends migration to opentelemetry projects.";
llama = walk; # Added 2023-01-23
# Linux kernels
···
linuxPackages_6_3 = linuxKernel.packages.linux_6_3;
linuxPackages_6_4 = linuxKernel.packages.linux_6_4;
linuxPackages_6_5 = linuxKernel.packages.linux_6_5;
linuxPackages_rpi0 = linuxKernel.packages.linux_rpi1;
linuxPackages_rpi02w = linuxKernel.packages.linux_rpi3;
linuxPackages_rpi1 = linuxKernel.packages.linux_rpi1;
+2 -12
pkgs/top-level/all-packages.nix
···
opentelemetry-collector = callPackage ../tools/misc/opentelemetry-collector { };
opentelemetry-collector-contrib = callPackage ../tools/misc/opentelemetry-collector/contrib.nix { };
-
opentracing-cpp = callPackage ../development/libraries/opentracing-cpp { };
-
openvswitch = callPackage ../os-specific/linux/openvswitch { };
openvswitch-lts = callPackage ../os-specific/linux/openvswitch/lts.nix { };
···
lightspark = callPackage ../misc/lightspark { };
-
lightstep-tracer-cpp = callPackage ../development/libraries/lightstep-tracer-cpp {
-
protobuf = protobuf3_21;
-
};
ligolo-ng = callPackage ../tools/networking/ligolo-ng { };
···
# hardened kernels
linuxPackages_hardened = linuxKernel.packages.linux_hardened;
linux_hardened = linuxPackages_hardened.kernel;
-
linuxPackages_4_14_hardened = linuxKernel.packages.linux_4_14_hardened;
-
linux_4_14_hardened = linuxPackages_4_14_hardened.kernel;
linuxPackages_4_19_hardened = linuxKernel.packages.linux_4_19_hardened;
linux_4_19_hardened = linuxPackages_4_19_hardened.kernel;
linuxPackages_5_4_hardened = linuxKernel.packages.linux_5_4_hardened;
···
linux_6_1_hardened = linuxKernel.kernels.linux_6_1_hardened;
linuxPackages_6_5_hardened = linuxKernel.packages.linux_6_5_hardened;
linux_6_5_hardened = linuxKernel.kernels.linux_6_5_hardened;
-
-
# Hardkernel (Odroid) kernels.
-
linuxPackages_hardkernel_latest = linuxKernel.packageAliases.linux_hardkernel_latest;
-
linux_hardkernel_latest = linuxPackages_hardkernel_latest.kernel;
# GNU Linux-libre kernels
linuxPackages-libre = linuxKernel.packages.linux_libre;
···
texlive = texlive.combined.scheme-medium;
};
-
ardour_6 = callPackage ../applications/audio/ardour/6.nix { };
ardour = callPackage ../applications/audio/ardour { };
arelle = with python3Packages; toPythonApplication arelle;
···
opentelemetry-collector = callPackage ../tools/misc/opentelemetry-collector { };
opentelemetry-collector-contrib = callPackage ../tools/misc/opentelemetry-collector/contrib.nix { };
openvswitch = callPackage ../os-specific/linux/openvswitch { };
openvswitch-lts = callPackage ../os-specific/linux/openvswitch/lts.nix { };
···
lightspark = callPackage ../misc/lightspark { };
+
opentracing-cpp = callPackage ../development/libraries/opentracing-cpp { };
ligolo-ng = callPackage ../tools/networking/ligolo-ng { };
···
# hardened kernels
linuxPackages_hardened = linuxKernel.packages.linux_hardened;
linux_hardened = linuxPackages_hardened.kernel;
linuxPackages_4_19_hardened = linuxKernel.packages.linux_4_19_hardened;
linux_4_19_hardened = linuxPackages_4_19_hardened.kernel;
linuxPackages_5_4_hardened = linuxKernel.packages.linux_5_4_hardened;
···
linux_6_1_hardened = linuxKernel.kernels.linux_6_1_hardened;
linuxPackages_6_5_hardened = linuxKernel.packages.linux_6_5_hardened;
linux_6_5_hardened = linuxKernel.kernels.linux_6_5_hardened;
# GNU Linux-libre kernels
linuxPackages-libre = linuxKernel.packages.linux_libre;
···
texlive = texlive.combined.scheme-medium;
};
ardour = callPackage ../applications/audio/ardour { };
+
ardour_7 = callPackage ../applications/audio/ardour/7.nix { };
arelle = with python3Packages; toPythonApplication arelle;
+2 -29
pkgs/top-level/linux-kernels.nix
···
rpiVersion = 4;
};
-
linux_4_14 = callPackage ../os-specific/linux/kernel/mainline.nix {
-
branch = "4.14";
-
kernelPatches =
-
[ kernelPatches.bridge_stp_helper
-
kernelPatches.request_key_helper
-
# See pkgs/os-specific/linux/kernel/cpu-cgroup-v2-patches/README.md
-
# when adding a new linux version
-
kernelPatches.cpu-cgroup-v2."4.11"
-
kernelPatches.modinst_arg_list_too_long
-
];
-
};
-
linux_4_19 = callPackage ../os-specific/linux/kernel/mainline.nix {
branch = "4.19";
kernelPatches =
···
];
};
-
linux_hardkernel_4_14 = callPackage ../os-specific/linux/kernel/linux-hardkernel-4.14.nix {
-
kernelPatches = [
-
kernelPatches.bridge_stp_helper
-
kernelPatches.request_key_helper
-
kernelPatches.modinst_arg_list_too_long
-
];
-
};
-
# Using zenKernels like this due lqx&zen came from one source, but may have different base kernel version
# https://github.com/NixOS/nixpkgs/pull/161773#discussion_r820134708
zenKernels = callPackage ../os-specific/linux/kernel/zen-kernels.nix;
···
linux_hardened = hardenedKernelFor packageAliases.linux_default.kernel { };
-
linux_4_14_hardened = hardenedKernelFor kernels.linux_4_14 {
-
stdenv = gcc10Stdenv;
-
buildPackages = buildPackages // { stdenv = buildPackages.gcc10Stdenv; };
-
};
linux_4_19_hardened = hardenedKernelFor kernels.linux_4_19 {
stdenv = gcc10Stdenv;
buildPackages = buildPackages // { stdenv = buildPackages.gcc10Stdenv; };
···
} // lib.optionalAttrs config.allowAliases {
linux_4_9 = throw "linux 4.9 was removed because it will reach its end of life within 22.11";
linux_5_18 = throw "linux 5.18 was removed because it has reached its end of life upstream";
linux_5_19 = throw "linux 5.19 was removed because it has reached its end of life upstream";
linux_6_0 = throw "linux 6.0 was removed because it has reached its end of life upstream";
···
vanillaPackages = {
# recurse to build modules for the kernels
-
linux_4_14 = recurseIntoAttrs (packagesFor kernels.linux_4_14);
linux_4_19 = recurseIntoAttrs (packagesFor kernels.linux_4_19);
linux_5_4 = recurseIntoAttrs (packagesFor kernels.linux_5_4);
linux_5_10 = recurseIntoAttrs (packagesFor kernels.linux_5_10);
···
linux_6_5 = recurseIntoAttrs (packagesFor kernels.linux_6_5);
} // lib.optionalAttrs config.allowAliases {
linux_4_9 = throw "linux 4.9 was removed because it will reach its end of life within 22.11"; # Added 2022-11-08
linux_5_18 = throw "linux 5.18 was removed because it reached its end of life upstream"; # Added 2022-09-17
linux_5_19 = throw "linux 5.19 was removed because it reached its end of life upstream"; # Added 2022-11-01
linux_6_0 = throw "linux 6.0 was removed because it reached its end of life upstream"; # Added 2023-01-20
···
linux_hardened = recurseIntoAttrs (packagesFor kernels.linux_hardened);
-
linux_4_14_hardened = recurseIntoAttrs (packagesFor kernels.linux_4_14_hardened);
linux_4_19_hardened = recurseIntoAttrs (packagesFor kernels.linux_4_19_hardened);
linux_5_4_hardened = recurseIntoAttrs (packagesFor kernels.linux_5_4_hardened);
linux_5_10_hardened = recurseIntoAttrs (packagesFor kernels.linux_5_10_hardened);
···
linux_xanmod_stable = recurseIntoAttrs (packagesFor kernels.linux_xanmod_stable);
linux_xanmod_latest = recurseIntoAttrs (packagesFor kernels.linux_xanmod_latest);
-
hardkernel_4_14 = recurseIntoAttrs (packagesFor kernels.linux_hardkernel_4_14);
-
linux_libre = recurseIntoAttrs (packagesFor kernels.linux_libre);
linux_latest_libre = recurseIntoAttrs (packagesFor kernels.linux_latest_libre);
···
linux_mptcp = throw "'linux_mptcp' has been moved to https://github.com/teto/mptcp-flake";
linux_rt_default = packages.linux_rt_5_4;
linux_rt_latest = packages.linux_rt_6_1;
-
linux_hardkernel_latest = packages.hardkernel_4_14;
};
manualConfig = callPackage ../os-specific/linux/kernel/manual-config.nix {};
···
rpiVersion = 4;
};
linux_4_19 = callPackage ../os-specific/linux/kernel/mainline.nix {
branch = "4.19";
kernelPatches =
···
];
};
# Using zenKernels like this due lqx&zen came from one source, but may have different base kernel version
# https://github.com/NixOS/nixpkgs/pull/161773#discussion_r820134708
zenKernels = callPackage ../os-specific/linux/kernel/zen-kernels.nix;
···
linux_hardened = hardenedKernelFor packageAliases.linux_default.kernel { };
linux_4_19_hardened = hardenedKernelFor kernels.linux_4_19 {
stdenv = gcc10Stdenv;
buildPackages = buildPackages // { stdenv = buildPackages.gcc10Stdenv; };
···
} // lib.optionalAttrs config.allowAliases {
linux_4_9 = throw "linux 4.9 was removed because it will reach its end of life within 22.11";
+
linux_4_14 = throw "linux 4.14 was removed because it will reach its end of life within 23.11";
linux_5_18 = throw "linux 5.18 was removed because it has reached its end of life upstream";
linux_5_19 = throw "linux 5.19 was removed because it has reached its end of life upstream";
linux_6_0 = throw "linux 6.0 was removed because it has reached its end of life upstream";
···
vanillaPackages = {
# recurse to build modules for the kernels
linux_4_19 = recurseIntoAttrs (packagesFor kernels.linux_4_19);
linux_5_4 = recurseIntoAttrs (packagesFor kernels.linux_5_4);
linux_5_10 = recurseIntoAttrs (packagesFor kernels.linux_5_10);
···
linux_6_5 = recurseIntoAttrs (packagesFor kernels.linux_6_5);
} // lib.optionalAttrs config.allowAliases {
linux_4_9 = throw "linux 4.9 was removed because it will reach its end of life within 22.11"; # Added 2022-11-08
+
linux_4_14 = throw "linux 4.14 was removed because it will reach its end of life within 23.11"; # Added 2023-10-11
linux_5_18 = throw "linux 5.18 was removed because it reached its end of life upstream"; # Added 2022-09-17
linux_5_19 = throw "linux 5.19 was removed because it reached its end of life upstream"; # Added 2022-11-01
linux_6_0 = throw "linux 6.0 was removed because it reached its end of life upstream"; # Added 2023-01-20
···
linux_hardened = recurseIntoAttrs (packagesFor kernels.linux_hardened);
linux_4_19_hardened = recurseIntoAttrs (packagesFor kernels.linux_4_19_hardened);
linux_5_4_hardened = recurseIntoAttrs (packagesFor kernels.linux_5_4_hardened);
linux_5_10_hardened = recurseIntoAttrs (packagesFor kernels.linux_5_10_hardened);
···
linux_xanmod_stable = recurseIntoAttrs (packagesFor kernels.linux_xanmod_stable);
linux_xanmod_latest = recurseIntoAttrs (packagesFor kernels.linux_xanmod_latest);
linux_libre = recurseIntoAttrs (packagesFor kernels.linux_libre);
linux_latest_libre = recurseIntoAttrs (packagesFor kernels.linux_latest_libre);
···
linux_mptcp = throw "'linux_mptcp' has been moved to https://github.com/teto/mptcp-flake";
linux_rt_default = packages.linux_rt_5_4;
linux_rt_latest = packages.linux_rt_6_1;
};
manualConfig = callPackage ../os-specific/linux/kernel/manual-config.nix {};