diff --git a/src/apprt/gtk/cgroup.zig b/src/apprt/gtk/cgroup.zig index b936d83a1..7eb72b9c6 100644 --- a/src/apprt/gtk/cgroup.zig +++ b/src/apprt/gtk/cgroup.zig @@ -66,8 +66,16 @@ pub fn init(app: *App) ![]const u8 { // can be monitored by things like systemd-oomd to kill if needed, // versus an instant hard kill. if (app.config.@"linux-cgroup-memory-limit") |limit| { - try internal_os.cgroup.configureMemoryLimit(surfaces, .{ - .high = limit, + try internal_os.cgroup.configureLimit(surfaces, .{ + .memory_high = limit, + }); + } + + // Configure the "max" pids limit. This is a hard limit and cannot be + // exceeded. + if (app.config.@"linux-cgroup-processes-limit") |limit| { + try internal_os.cgroup.configureLimit(surfaces, .{ + .pids_max = limit, }); } diff --git a/src/config/Config.zig b/src/config/Config.zig index e5ee2bc22..7889e12a8 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1276,6 +1276,13 @@ keybind: Keybinds = .{}, /// pressure. @"linux-cgroup-memory-limit": ?u64 = null, +/// Number of processes limit for any individual terminal process (tab, split, +/// window, etc.). If this is unset then no limit will be set. +/// +/// Note that this sets the "pids.max" configuration for the process number +/// controller, which is a hard limit. +@"linux-cgroup-processes-limit": ?u64 = null, + /// If this is false, then any cgroup initialization (for linux-cgroup) /// will be allowed to fail and the failure is ignored. This is useful if /// you view cgroup isolation as a "nice to have" and not a critical resource diff --git a/src/os/cgroup.zig b/src/os/cgroup.zig index 5a4082b15..0a66c5987 100644 --- a/src/os/cgroup.zig +++ b/src/os/cgroup.zig @@ -180,18 +180,19 @@ pub fn configureControllers( try file.writer().writeAll(v); } -pub const MemoryLimit = union(enum) { - /// memory.high - high: usize, +pub const Limit = union(enum) { + memory_high: usize, + pids_max: usize, }; -/// Configure the memory limit for the given cgroup. Use the various -/// fields in MemoryLimit to configure a specific type of limit. -pub fn configureMemoryLimit(cgroup: []const u8, limit: MemoryLimit) !void { +/// Configure a limit for the given cgroup. Use the various +/// fields in Limit to configure a specific type of limit. +pub fn configureLimit(cgroup: []const u8, limit: Limit) !void { assert(cgroup[0] == '/'); const filename, const size = switch (limit) { - .high => |v| .{ "memory.high", v }, + .memory_high => |v| .{ "memory.high", v }, + .pids_max => |v| .{ "pids.max", v }, }; // Open our file