Skip to content

Commit c49a94b

Browse files
committed
8370572: Cgroups hierarchical memory limit is not honored after JDK-8322420
Reviewed-by: simonis, sgehwolf
1 parent 414e728 commit c49a94b

File tree

3 files changed

+30
-11
lines changed

3 files changed

+30
-11
lines changed

src/hotspot/os/linux/cgroupSubsystem_linux.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,17 @@
102102
log_trace(os, container)(log_string " is: %s", retval); \
103103
}
104104

105+
#define CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(controller, filename, key, log_string, retval) \
106+
{ \
107+
bool is_ok; \
108+
is_ok = controller->read_numerical_key_value(filename, key, &retval); \
109+
if (!is_ok) { \
110+
log_trace(os, container)(log_string " failed: %d", OSCONTAINER_ERROR); \
111+
return OSCONTAINER_ERROR; \
112+
} \
113+
log_trace(os, container)(log_string " is: " JULONG_FORMAT, retval); \
114+
}
115+
105116
class CgroupController: public CHeapObj<mtInternal> {
106117
protected:
107118
char* _cgroup_path;

src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ void CgroupV1Controller::set_subsystem_path(const char* cgroup_path) {
124124
}
125125
}
126126

127+
jlong CgroupV1MemoryController::uses_mem_hierarchy() {
128+
julong use_hierarchy;
129+
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy);
130+
return (jlong)use_hierarchy;
131+
}
132+
127133
/*
128134
* The common case, containers, we have _root == _cgroup_path, and thus set the
129135
* controller path to the _mount_point. This is where the limits are exposed in
@@ -160,13 +166,13 @@ void verbose_log(julong read_mem_limit, julong upper_mem_bound) {
160166
jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong upper_bound) {
161167
julong memlimit;
162168
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.limit_in_bytes", "Memory Limit", memlimit);
163-
if (memlimit >= upper_bound) {
164-
verbose_log(memlimit, upper_bound);
165-
return (jlong)-1;
166-
} else {
167-
verbose_log(memlimit, upper_bound);
168-
return (jlong)memlimit;
169+
if (memlimit >= upper_bound && uses_mem_hierarchy()) {
170+
CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat",
171+
"hierarchical_memory_limit", "Hierarchical Memory Limit",
172+
memlimit);
169173
}
174+
verbose_log(memlimit, upper_bound);
175+
return (jlong)((memlimit < upper_bound) ? memlimit : -1);
170176
}
171177

172178
/* read_mem_swap
@@ -184,12 +190,13 @@ jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong upper_bound) {
184190
jlong CgroupV1MemoryController::read_mem_swap(julong upper_memsw_bound) {
185191
julong memswlimit;
186192
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit);
187-
if (memswlimit >= upper_memsw_bound) {
188-
log_trace(os, container)("Memory and Swap Limit is: Unlimited");
189-
return (jlong)-1;
190-
} else {
191-
return (jlong)memswlimit;
193+
if (memswlimit >= upper_memsw_bound && uses_mem_hierarchy()) {
194+
CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat",
195+
"hierarchical_memsw_limit", "Hierarchical Memory and Swap Limit",
196+
memswlimit);
192197
}
198+
verbose_log(memswlimit, upper_memsw_bound);
199+
return (jlong)((memswlimit < upper_memsw_bound) ? memswlimit : -1);
193200
}
194201

195202
jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) {

src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class CgroupV1MemoryController final : public CgroupMemoryController {
100100
const char* mount_point() override { return reader()->mount_point(); }
101101
const char* cgroup_path() override { return reader()->cgroup_path(); }
102102
private:
103+
jlong uses_mem_hierarchy();
103104
jlong read_mem_swappiness();
104105
jlong read_mem_swap(julong upper_memsw_bound);
105106

0 commit comments

Comments
 (0)