Skip to content

Commit 5a08f94

Browse files
committed
8370572: Cgroups hierarchical memory limit is not honored after JDK-8322420
Reviewed-by: shade, phh Backport-of: c49a94b
1 parent ced6e95 commit 5a08f94

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
@@ -123,6 +123,12 @@ void CgroupV1Controller::set_subsystem_path(const char* cgroup_path) {
123123
}
124124
}
125125

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

171177
/* read_mem_swap
@@ -183,12 +189,13 @@ jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
183189
jlong CgroupV1MemoryController::read_mem_swap(julong host_total_memsw) {
184190
julong memswlimit;
185191
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit);
186-
if (memswlimit >= host_total_memsw) {
187-
log_trace(os, container)("Memory and Swap Limit is: Unlimited");
188-
return (jlong)-1;
189-
} else {
190-
return (jlong)memswlimit;
192+
if (memswlimit >= host_total_memsw && uses_mem_hierarchy()) {
193+
CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat",
194+
"hierarchical_memsw_limit", "Hierarchical Memory and Swap Limit",
195+
memswlimit);
191196
}
197+
verbose_log(memswlimit, host_total_memsw);
198+
return (jlong)((memswlimit < host_total_memsw) ? memswlimit : -1);
192199
}
193200

194201
jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) {

src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp

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

0 commit comments

Comments
 (0)