Skip to content

Commit b887f2d

Browse files
committed
[GR-66564] Adopt JDK-8356868: Not all cgroup parameters are made available
PullRequest: graal/21275
2 parents 3d65c5c + 14bffd6 commit b887f2d

23 files changed

+684
-354
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,46 +48,47 @@
4848
@CContext(ContainerLibraryDirectives.class)
4949
@CLibrary(value = "svm_container", requireStatic = true, dependsOn = "m")
5050
// The following annotations are for files in `src/hotspot`, which are copied from the JDK
51-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/java.base/share/native/include/jni.h")
52-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/java.base/unix/native/include/jni_md.h")
51+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/java.base/share/native/include/jni.h")
52+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/java.base/unix/native/include/jni_md.h")
5353
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupSubsystem_linux.cpp")
5454
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupSubsystem_linux.hpp")
55-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/os/linux/cgroupUtil_linux.cpp")
56-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/os/linux/cgroupUtil_linux.hpp")
55+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupUtil_linux.cpp")
56+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupUtil_linux.hpp")
5757
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp")
5858
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp")
5959
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp")
6060
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp")
6161
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/osContainer_linux.cpp")
6262
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/osContainer_linux.hpp")
6363
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/os_linux.cpp")
64-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/os/linux/os_linux.hpp")
65-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/os/linux/os_linux.inline.hpp")
66-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/os/posix/include/jvm_md.h")
64+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/os_linux.hpp")
65+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/os_linux.inline.hpp")
66+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/posix/include/jvm_md.h")
6767
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+2/src/hotspot/os/posix/os_posix.cpp")
68-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+25/src/hotspot/os/posix/os_posix.hpp")
69-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/os/posix/os_posix.inline.hpp")
70-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+26/src/hotspot/share/memory/allocation.hpp")
71-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+21/src/hotspot/share/memory/allocation.inline.hpp")
72-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/memory/allStatic.hpp")
73-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/nmt/memTag.hpp")
74-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+22/src/hotspot/share/runtime/os.cpp")
75-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+25/src/hotspot/share/runtime/os.hpp")
76-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/runtime/os.inline.hpp")
77-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/utilities/checkedCast.hpp")
78-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+22/src/hotspot/share/utilities/compilerWarnings_gcc.hpp")
79-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+22/src/hotspot/share/utilities/compilerWarnings.hpp")
80-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/utilities/globalDefinitions_gcc.hpp")
81-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+23/src/hotspot/share/utilities/globalDefinitions.hpp")
82-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+21/src/hotspot/share/utilities/macros.hpp")
83-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+23/src/hotspot/share/utilities/ostream.cpp")
84-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+23/src/hotspot/share/utilities/ostream.hpp")
68+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/posix/os_posix.hpp")
69+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/posix/os_posix.inline.hpp")
70+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allocation.hpp")
71+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allocation.inline.hpp")
72+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allStatic.hpp")
73+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/nmt/memTag.hpp")
74+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/os.cpp")
75+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/os.hpp")
76+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/os.inline.hpp")
77+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/checkedCast.hpp")
78+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/compilerWarnings_gcc.hpp")
79+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/compilerWarnings.hpp")
80+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/globalDefinitions_gcc.hpp")
81+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/globalDefinitions.hpp")
82+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/macros.hpp")
83+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/ostream.cpp")
84+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/ostream.hpp")
85+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/permitForbiddenFunctions.hpp")
8586
// The following annotations are for files in `src/svm`, which are completely customized for SVM
86-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/logging/log.hpp")
87-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+26/src/hotspot/share/memory/allocation.cpp")
87+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/logging/log.hpp")
88+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allocation.cpp")
8889
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/globals.hpp")
8990
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+3/src/hotspot/share/utilities/debug.cpp")
90-
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+18/src/hotspot/share/utilities/debug.hpp")
91+
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/debug.hpp")
9192
public class ContainerLibrary {
9293
static final int VERSION = 240100;
9394

substratevm/src/com.oracle.svm.native.libcontainer/src/hotspot/os/linux/cgroupSubsystem_linux.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -66,7 +66,7 @@ CgroupSubsystem* CgroupSubsystemFactory::create() {
6666
CgroupV1MemoryController* memory = nullptr;
6767
CgroupV1Controller* cpuset = nullptr;
6868
CgroupV1CpuController* cpu = nullptr;
69-
CgroupV1Controller* cpuacct = nullptr;
69+
CgroupV1CpuacctController* cpuacct = nullptr;
7070
CgroupV1Controller* pids = nullptr;
7171
CgroupInfo cg_infos[CG_INFO_LENGTH];
7272
u1 cg_type_flags = INVALID_CGROUPS_GENERIC;
@@ -109,9 +109,10 @@ CgroupSubsystem* CgroupSubsystemFactory::create() {
109109
CgroupV2CpuController* cpu = new CgroupV2CpuController(CgroupV2Controller(cg_infos[CPU_IDX]._mount_path,
110110
cg_infos[CPU_IDX]._cgroup_path,
111111
cg_infos[CPU_IDX]._read_only));
112+
CgroupV2CpuacctController* cpuacct = new CgroupV2CpuacctController(cpu);
112113
log_debug(os, container)("Detected cgroups v2 unified hierarchy");
113114
cleanup(cg_infos);
114-
return new CgroupV2Subsystem(memory, cpu, mem_other);
115+
return new CgroupV2Subsystem(memory, cpu, cpuacct, mem_other);
115116
}
116117

117118
/*
@@ -154,7 +155,7 @@ CgroupSubsystem* CgroupSubsystemFactory::create() {
154155
cpu = new CgroupV1CpuController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only));
155156
cpu->set_subsystem_path(info._cgroup_path);
156157
} else if (strcmp(info._name, "cpuacct") == 0) {
157-
cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
158+
cpuacct = new CgroupV1CpuacctController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only));
158159
cpuacct->set_subsystem_path(info._cgroup_path);
159160
} else if (strcmp(info._name, "pids") == 0) {
160161
pids = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
@@ -301,6 +302,7 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos,
301302
} else {
302303
log_debug(os, container)("Can't read %s, %s", controllers_file, os::strerror(errno));
303304
*flags = INVALID_CGROUPS_V2;
305+
fclose(controllers);
304306
return false;
305307
}
306308
for (int i = 0; i < CG_INFO_LENGTH; i++) {
@@ -361,7 +363,7 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos,
361363
all_required_controllers_enabled = all_required_controllers_enabled && cg_infos[i]._enabled;
362364
}
363365
if (log_is_enabled(Debug, os, container) && !cg_infos[i]._enabled) {
364-
log_debug(os, container)("controller %s is not enabled\n", cg_controller_name[i]);
366+
log_debug(os, container)("controller %s is not enabled", cg_controller_name[i]);
365367
}
366368
}
367369
}
@@ -859,6 +861,10 @@ jlong CgroupSubsystem::memory_soft_limit_in_bytes() {
859861
return memory_controller()->controller()->memory_soft_limit_in_bytes(phys_mem);
860862
}
861863

864+
jlong CgroupSubsystem::memory_throttle_limit_in_bytes() {
865+
return memory_controller()->controller()->memory_throttle_limit_in_bytes();
866+
}
867+
862868
jlong CgroupSubsystem::memory_usage_in_bytes() {
863869
return memory_controller()->controller()->memory_usage_in_bytes();
864870
}
@@ -887,6 +893,10 @@ int CgroupSubsystem::cpu_shares() {
887893
return cpu_controller()->controller()->cpu_shares();
888894
}
889895

896+
jlong CgroupSubsystem::cpu_usage_in_micros() {
897+
return cpuacct_controller()->cpu_usage_in_micros();
898+
}
899+
890900
#ifndef NATIVE_IMAGE
891901
void CgroupSubsystem::print_version_specific_info(outputStream* st) {
892902
julong phys_mem = os::Linux::physical_memory();

substratevm/src/com.oracle.svm.native.libcontainer/src/hotspot/os/linux/cgroupSubsystem_linux.hpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -227,6 +227,18 @@ class CgroupCpuController: public CHeapObj<mtInternal> {
227227
virtual const char* cgroup_path() = 0;
228228
};
229229

230+
// Pure virtual class representing version agnostic CPU accounting controllers
231+
class CgroupCpuacctController: public CHeapObj<mtInternal> {
232+
public:
233+
virtual jlong cpu_usage_in_micros() = 0;
234+
virtual bool needs_hierarchy_adjustment() = 0;
235+
virtual bool is_read_only() = 0;
236+
virtual const char* subsystem_path() = 0;
237+
virtual void set_subsystem_path(const char* cgroup_path) = 0;
238+
virtual const char* mount_point() = 0;
239+
virtual const char* cgroup_path() = 0;
240+
};
241+
230242
// Pure virtual class representing version agnostic memory controllers
231243
class CgroupMemoryController: public CHeapObj<mtInternal> {
232244
public:
@@ -235,6 +247,7 @@ class CgroupMemoryController: public CHeapObj<mtInternal> {
235247
virtual jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) = 0;
236248
virtual jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) = 0;
237249
virtual jlong memory_soft_limit_in_bytes(julong upper_bound) = 0;
250+
virtual jlong memory_throttle_limit_in_bytes() = 0;
238251
virtual jlong memory_max_usage_in_bytes() = 0;
239252
virtual jlong rss_usage_in_bytes() = 0;
240253
virtual jlong cache_usage_in_bytes() = 0;
@@ -263,15 +276,19 @@ class CgroupSubsystem: public CHeapObj<mtInternal> {
263276
virtual const char * container_type() = 0;
264277
virtual CachingCgroupController<CgroupMemoryController>* memory_controller() = 0;
265278
virtual CachingCgroupController<CgroupCpuController>* cpu_controller() = 0;
279+
virtual CgroupCpuacctController* cpuacct_controller() = 0;
266280

267281
int cpu_quota();
268282
int cpu_period();
269283
int cpu_shares();
270284

285+
jlong cpu_usage_in_micros();
286+
271287
jlong memory_usage_in_bytes();
272288
jlong memory_and_swap_limit_in_bytes();
273289
jlong memory_and_swap_usage_in_bytes();
274290
jlong memory_soft_limit_in_bytes();
291+
jlong memory_throttle_limit_in_bytes();
275292
jlong memory_max_usage_in_bytes();
276293
jlong rss_usage_in_bytes();
277294
jlong cache_usage_in_bytes();

substratevm/src/com.oracle.svm.native.libcontainer/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,16 @@ jlong CgroupV1MemoryController::memory_soft_limit_in_bytes(julong phys_mem) {
252252
}
253253
}
254254

255+
jlong CgroupV1MemoryController::memory_throttle_limit_in_bytes() {
256+
// Log this string at trace level so as to make tests happy.
257+
log_trace(os, container)("Memory Throttle Limit is not supported.");
258+
return OSCONTAINER_ERROR; // not supported
259+
}
260+
255261
// Constructor
256262
CgroupV1Subsystem::CgroupV1Subsystem(CgroupV1Controller* cpuset,
257263
CgroupV1CpuController* cpu,
258-
CgroupV1Controller* cpuacct,
264+
CgroupV1CpuacctController* cpuacct,
259265
CgroupV1Controller* pids,
260266
CgroupV1MemoryController* memory) :
261267
_cpuset(cpuset),
@@ -422,6 +428,13 @@ int CgroupV1CpuController::cpu_shares() {
422428
return shares_int;
423429
}
424430

431+
jlong CgroupV1CpuacctController::cpu_usage_in_micros() {
432+
julong cpu_usage;
433+
CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpuacct.usage", "CPU Usage", cpu_usage);
434+
// Output is in nanoseconds, convert to microseconds.
435+
return (jlong)cpu_usage / 1000;
436+
}
437+
425438
/* pids_max
426439
*
427440
* Return the maximum number of tasks available to the process

substratevm/src/com.oracle.svm.native.libcontainer/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -86,6 +86,7 @@ class CgroupV1MemoryController final : public CgroupMemoryController {
8686
jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) override;
8787
jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) override;
8888
jlong memory_soft_limit_in_bytes(julong upper_bound) override;
89+
jlong memory_throttle_limit_in_bytes() override;
8990
jlong memory_max_usage_in_bytes() override;
9091
jlong rss_usage_in_bytes() override;
9192
jlong cache_usage_in_bytes() override;
@@ -146,12 +147,41 @@ class CgroupV1CpuController final : public CgroupCpuController {
146147
}
147148
};
148149

150+
class CgroupV1CpuacctController final : public CgroupCpuacctController {
151+
152+
private:
153+
CgroupV1Controller _reader;
154+
CgroupV1Controller* reader() { return &_reader; }
155+
public:
156+
jlong cpu_usage_in_micros() override;
157+
void set_subsystem_path(const char *cgroup_path) override {
158+
reader()->set_subsystem_path(cgroup_path);
159+
}
160+
bool is_read_only() override {
161+
return reader()->is_read_only();
162+
}
163+
const char* subsystem_path() override {
164+
return reader()->subsystem_path();
165+
}
166+
const char* mount_point() override {
167+
return reader()->mount_point();
168+
}
169+
bool needs_hierarchy_adjustment() override {
170+
return reader()->needs_hierarchy_adjustment();
171+
}
172+
const char* cgroup_path() override { return reader()->cgroup_path(); }
173+
174+
public:
175+
CgroupV1CpuacctController(const CgroupV1Controller& reader) : _reader(reader) {
176+
}
177+
};
178+
149179
class CgroupV1Subsystem: public CgroupSubsystem {
150180

151181
public:
152182
CgroupV1Subsystem(CgroupV1Controller* cpuset,
153183
CgroupV1CpuController* cpu,
154-
CgroupV1Controller* cpuacct,
184+
CgroupV1CpuacctController* cpuacct,
155185
CgroupV1Controller* pids,
156186
CgroupV1MemoryController* memory);
157187

@@ -171,13 +201,14 @@ class CgroupV1Subsystem: public CgroupSubsystem {
171201
}
172202
CachingCgroupController<CgroupMemoryController>* memory_controller() { return _memory; }
173203
CachingCgroupController<CgroupCpuController>* cpu_controller() { return _cpu; }
204+
CgroupCpuacctController* cpuacct_controller() { return _cpuacct; }
174205

175206
private:
176207
/* controllers */
177208
CachingCgroupController<CgroupMemoryController>* _memory = nullptr;
178209
CgroupV1Controller* _cpuset = nullptr;
179210
CachingCgroupController<CgroupCpuController>* _cpu = nullptr;
180-
CgroupV1Controller* _cpuacct = nullptr;
211+
CgroupV1CpuacctController* _cpuacct = nullptr;
181212
CgroupV1Controller* _pids = nullptr;
182213

183214
};

substratevm/src/com.oracle.svm.native.libcontainer/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2020, 2025, Red Hat Inc. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
@@ -119,12 +119,14 @@ int CgroupV2CpuController::cpu_quota() {
119119
// Constructor
120120
CgroupV2Subsystem::CgroupV2Subsystem(CgroupV2MemoryController * memory,
121121
CgroupV2CpuController* cpu,
122+
CgroupV2CpuacctController* cpuacct,
122123
CgroupV2Controller unified) :
123124
_unified(unified) {
124125
CgroupUtil::adjust_controller(memory);
125126
CgroupUtil::adjust_controller(cpu);
126127
_memory = new CachingCgroupController<CgroupMemoryController>(memory);
127128
_cpu = new CachingCgroupController<CgroupCpuController>(cpu);
129+
_cpuacct = cpuacct;
128130
}
129131

130132
bool CgroupV2Subsystem::is_containerized() {
@@ -157,6 +159,17 @@ int CgroupV2CpuController::cpu_period() {
157159
return period;
158160
}
159161

162+
jlong CgroupV2CpuController::cpu_usage_in_micros() {
163+
julong cpu_usage;
164+
bool is_ok = reader()->read_numerical_key_value("/cpu.stat", "usage_usec", &cpu_usage);
165+
if (!is_ok) {
166+
log_trace(os, container)("CPU Usage failed: %d", OSCONTAINER_ERROR);
167+
return OSCONTAINER_ERROR;
168+
}
169+
log_trace(os, container)("CPU Usage is: " JULONG_FORMAT, cpu_usage);
170+
return (jlong)cpu_usage;
171+
}
172+
160173
/* memory_usage_in_bytes
161174
*
162175
* Return the amount of used memory used by this cgroup and descendents
@@ -178,10 +191,16 @@ jlong CgroupV2MemoryController::memory_soft_limit_in_bytes(julong phys_mem) {
178191
return mem_soft_limit;
179192
}
180193

194+
jlong CgroupV2MemoryController::memory_throttle_limit_in_bytes() {
195+
jlong mem_throttle_limit;
196+
CONTAINER_READ_NUMBER_CHECKED_MAX(reader(), "/memory.high", "Memory Throttle Limit", mem_throttle_limit);
197+
return mem_throttle_limit;
198+
}
199+
181200
jlong CgroupV2MemoryController::memory_max_usage_in_bytes() {
182-
// Log this string at trace level so as to make tests happy.
183-
log_trace(os, container)("Maximum Memory Usage is not supported.");
184-
return OSCONTAINER_ERROR; // not supported
201+
julong mem_max_usage;
202+
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.peak", "Maximum Memory Usage", mem_max_usage);
203+
return mem_max_usage;
185204
}
186205

187206
jlong CgroupV2MemoryController::rss_usage_in_bytes() {

0 commit comments

Comments
 (0)