Skip to content

Commit 5252262

Browse files
committed
8292984: Refactor internal container-related interfaces for clarity
Reviewed-by: sgehwolf, eosterlund
1 parent 2c7f738 commit 5252262

9 files changed

+108
-103
lines changed

src/hotspot/os/linux/cgroupSubsystem_linux.cpp

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -665,15 +665,13 @@ int CgroupSubsystem::active_processor_count() {
665665
* -1 for unlimited
666666
* OSCONTAINER_ERROR for not supported
667667
*/
668-
jlong CgroupSubsystem::memory_limit_in_bytes() {
668+
jlong CgroupSubsystem::memory_limit_in_bytes(julong upper_bound) {
669669
CachingCgroupController<CgroupMemoryController>* contrl = memory_controller();
670670
CachedMetric* memory_limit = contrl->metrics_cache();
671671
if (!memory_limit->should_check_metric()) {
672672
return memory_limit->value();
673673
}
674-
julong phys_mem = static_cast<julong>(os::Linux::physical_memory());
675-
log_trace(os, container)("total physical memory: " JULONG_FORMAT, phys_mem);
676-
jlong mem_limit = contrl->controller()->read_memory_limit_in_bytes(phys_mem);
674+
jlong mem_limit = contrl->controller()->read_memory_limit_in_bytes(upper_bound);
677675
// Update cached metric to avoid re-reading container settings too often
678676
memory_limit->set_value(mem_limit, OSCONTAINER_CACHE_TIMEOUT);
679677
return mem_limit;
@@ -841,21 +839,16 @@ jlong CgroupController::limit_from_str(char* limit_str) {
841839

842840
// CgroupSubsystem implementations
843841

844-
jlong CgroupSubsystem::memory_and_swap_limit_in_bytes() {
845-
julong phys_mem = static_cast<julong>(os::Linux::physical_memory());
846-
julong host_swap = os::Linux::host_swap();
847-
return memory_controller()->controller()->memory_and_swap_limit_in_bytes(phys_mem, host_swap);
842+
jlong CgroupSubsystem::memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) {
843+
return memory_controller()->controller()->memory_and_swap_limit_in_bytes(upper_mem_bound, upper_swap_bound);
848844
}
849845

850-
jlong CgroupSubsystem::memory_and_swap_usage_in_bytes() {
851-
julong phys_mem = static_cast<julong>(os::Linux::physical_memory());
852-
julong host_swap = os::Linux::host_swap();
853-
return memory_controller()->controller()->memory_and_swap_usage_in_bytes(phys_mem, host_swap);
846+
jlong CgroupSubsystem::memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound) {
847+
return memory_controller()->controller()->memory_and_swap_usage_in_bytes(upper_mem_bound, upper_swap_bound);
854848
}
855849

856-
jlong CgroupSubsystem::memory_soft_limit_in_bytes() {
857-
julong phys_mem = static_cast<julong>(os::Linux::physical_memory());
858-
return memory_controller()->controller()->memory_soft_limit_in_bytes(phys_mem);
850+
jlong CgroupSubsystem::memory_soft_limit_in_bytes(julong upper_bound) {
851+
return memory_controller()->controller()->memory_soft_limit_in_bytes(upper_bound);
859852
}
860853

861854
jlong CgroupSubsystem::memory_throttle_limit_in_bytes() {
@@ -894,7 +887,6 @@ jlong CgroupSubsystem::cpu_usage_in_micros() {
894887
return cpuacct_controller()->cpu_usage_in_micros();
895888
}
896889

897-
void CgroupSubsystem::print_version_specific_info(outputStream* st) {
898-
julong phys_mem = static_cast<julong>(os::Linux::physical_memory());
899-
memory_controller()->controller()->print_version_specific_info(st, phys_mem);
890+
void CgroupSubsystem::print_version_specific_info(outputStream* st, julong upper_mem_bound) {
891+
memory_controller()->controller()->print_version_specific_info(st, upper_mem_bound);
900892
}

src/hotspot/os/linux/cgroupSubsystem_linux.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,14 +233,14 @@ class CgroupMemoryController: public CHeapObj<mtInternal> {
233233
public:
234234
virtual jlong read_memory_limit_in_bytes(julong upper_bound) = 0;
235235
virtual jlong memory_usage_in_bytes() = 0;
236-
virtual jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) = 0;
237-
virtual jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) = 0;
236+
virtual jlong memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) = 0;
237+
virtual jlong memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound) = 0;
238238
virtual jlong memory_soft_limit_in_bytes(julong upper_bound) = 0;
239239
virtual jlong memory_throttle_limit_in_bytes() = 0;
240240
virtual jlong memory_max_usage_in_bytes() = 0;
241241
virtual jlong rss_usage_in_bytes() = 0;
242242
virtual jlong cache_usage_in_bytes() = 0;
243-
virtual void print_version_specific_info(outputStream* st, julong host_mem) = 0;
243+
virtual void print_version_specific_info(outputStream* st, julong upper_mem_bound) = 0;
244244
virtual bool needs_hierarchy_adjustment() = 0;
245245
virtual bool is_read_only() = 0;
246246
virtual const char* subsystem_path() = 0;
@@ -251,7 +251,7 @@ class CgroupMemoryController: public CHeapObj<mtInternal> {
251251

252252
class CgroupSubsystem: public CHeapObj<mtInternal> {
253253
public:
254-
jlong memory_limit_in_bytes();
254+
jlong memory_limit_in_bytes(julong upper_bound);
255255
int active_processor_count();
256256

257257
virtual jlong pids_max() = 0;
@@ -272,14 +272,14 @@ class CgroupSubsystem: public CHeapObj<mtInternal> {
272272
jlong cpu_usage_in_micros();
273273

274274
jlong memory_usage_in_bytes();
275-
jlong memory_and_swap_limit_in_bytes();
276-
jlong memory_and_swap_usage_in_bytes();
277-
jlong memory_soft_limit_in_bytes();
275+
jlong memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound);
276+
jlong memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound);
277+
jlong memory_soft_limit_in_bytes(julong upper_bound);
278278
jlong memory_throttle_limit_in_bytes();
279279
jlong memory_max_usage_in_bytes();
280280
jlong rss_usage_in_bytes();
281281
jlong cache_usage_in_bytes();
282-
void print_version_specific_info(outputStream* st);
282+
void print_version_specific_info(outputStream* st, julong upper_mem_bound);
283283
};
284284

285285
// Utility class for storing info retrieved from /proc/cgroups,

src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -136,35 +136,35 @@ bool CgroupV1Controller::needs_hierarchy_adjustment() {
136136
}
137137

138138
static inline
139-
void verbose_log(julong read_mem_limit, julong host_mem) {
139+
void verbose_log(julong read_mem_limit, julong upper_mem_bound) {
140140
if (log_is_enabled(Debug, os, container)) {
141141
jlong mem_limit = (jlong)read_mem_limit; // account for negative values
142-
if (mem_limit < 0 || read_mem_limit >= host_mem) {
142+
if (mem_limit < 0 || read_mem_limit >= upper_mem_bound) {
143143
const char *reason;
144144
if (mem_limit == OSCONTAINER_ERROR) {
145145
reason = "failed";
146146
} else if (mem_limit == -1) {
147147
reason = "unlimited";
148148
} else {
149-
assert(read_mem_limit >= host_mem, "Expected read value exceeding host_mem");
149+
assert(read_mem_limit >= upper_mem_bound, "Expected read value exceeding upper memory bound");
150150
// Exceeding physical memory is treated as unlimited. This implementation
151151
// caps it at host_mem since Cg v1 has no value to represent 'max'.
152152
reason = "ignored";
153153
}
154-
log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT,
155-
reason, mem_limit, host_mem);
154+
log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", upper bound is " JLONG_FORMAT,
155+
reason, mem_limit, upper_mem_bound);
156156
}
157157
}
158158
}
159159

160-
jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
160+
jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong upper_bound) {
161161
julong memlimit;
162162
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.limit_in_bytes", "Memory Limit", memlimit);
163-
if (memlimit >= phys_mem) {
164-
verbose_log(memlimit, phys_mem);
163+
if (memlimit >= upper_bound) {
164+
verbose_log(memlimit, upper_bound);
165165
return (jlong)-1;
166166
} else {
167-
verbose_log(memlimit, phys_mem);
167+
verbose_log(memlimit, upper_bound);
168168
return (jlong)memlimit;
169169
}
170170
}
@@ -181,19 +181,19 @@ jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
181181
* * -1 if there isn't any limit in place (note: includes values which exceed a physical
182182
* upper bound)
183183
*/
184-
jlong CgroupV1MemoryController::read_mem_swap(julong host_total_memsw) {
184+
jlong CgroupV1MemoryController::read_mem_swap(julong upper_memsw_bound) {
185185
julong memswlimit;
186186
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit);
187-
if (memswlimit >= host_total_memsw) {
187+
if (memswlimit >= upper_memsw_bound) {
188188
log_trace(os, container)("Memory and Swap Limit is: Unlimited");
189189
return (jlong)-1;
190190
} else {
191191
return (jlong)memswlimit;
192192
}
193193
}
194194

195-
jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) {
196-
jlong memory_swap = read_mem_swap(host_mem + host_swap);
195+
jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) {
196+
jlong memory_swap = read_mem_swap(upper_mem_bound + upper_swap_bound);
197197
if (memory_swap == -1) {
198198
return memory_swap;
199199
}
@@ -202,7 +202,7 @@ jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong host_mem,
202202
// supported.
203203
jlong swappiness = read_mem_swappiness();
204204
if (swappiness == 0 || memory_swap == OSCONTAINER_ERROR) {
205-
jlong memlimit = read_memory_limit_in_bytes(host_mem);
205+
jlong memlimit = read_memory_limit_in_bytes(upper_mem_bound);
206206
if (memory_swap == OSCONTAINER_ERROR) {
207207
log_trace(os, container)("Memory and Swap Limit has been reset to " JLONG_FORMAT " because swap is not supported", memlimit);
208208
} else {
@@ -220,9 +220,9 @@ jlong memory_swap_usage_impl(CgroupController* ctrl) {
220220
return (jlong)memory_swap_usage;
221221
}
222222

223-
jlong CgroupV1MemoryController::memory_and_swap_usage_in_bytes(julong phys_mem, julong host_swap) {
224-
jlong memory_sw_limit = memory_and_swap_limit_in_bytes(phys_mem, host_swap);
225-
jlong memory_limit = read_memory_limit_in_bytes(phys_mem);
223+
jlong CgroupV1MemoryController::memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound) {
224+
jlong memory_sw_limit = memory_and_swap_limit_in_bytes(upper_mem_bound, upper_swap_bound);
225+
jlong memory_limit = read_memory_limit_in_bytes(upper_mem_bound);
226226
if (memory_sw_limit > 0 && memory_limit > 0) {
227227
jlong delta_swap = memory_sw_limit - memory_limit;
228228
if (delta_swap > 0) {
@@ -238,10 +238,10 @@ jlong CgroupV1MemoryController::read_mem_swappiness() {
238238
return (jlong)swappiness;
239239
}
240240

241-
jlong CgroupV1MemoryController::memory_soft_limit_in_bytes(julong phys_mem) {
241+
jlong CgroupV1MemoryController::memory_soft_limit_in_bytes(julong upper_bound) {
242242
julong memsoftlimit;
243243
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.soft_limit_in_bytes", "Memory Soft Limit", memsoftlimit);
244-
if (memsoftlimit >= phys_mem) {
244+
if (memsoftlimit >= upper_bound) {
245245
log_trace(os, container)("Memory Soft Limit is: Unlimited");
246246
return (jlong)-1;
247247
} else {
@@ -336,10 +336,10 @@ jlong CgroupV1MemoryController::kernel_memory_usage_in_bytes() {
336336
return (jlong)kmem_usage;
337337
}
338338

339-
jlong CgroupV1MemoryController::kernel_memory_limit_in_bytes(julong phys_mem) {
339+
jlong CgroupV1MemoryController::kernel_memory_limit_in_bytes(julong upper_bound) {
340340
julong kmem_limit;
341341
CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.limit_in_bytes", "Kernel Memory Limit", kmem_limit);
342-
if (kmem_limit >= phys_mem) {
342+
if (kmem_limit >= upper_bound) {
343343
return (jlong)-1;
344344
}
345345
return (jlong)kmem_limit;
@@ -351,9 +351,9 @@ jlong CgroupV1MemoryController::kernel_memory_max_usage_in_bytes() {
351351
return (jlong)kmem_max_usage;
352352
}
353353

354-
void CgroupV1MemoryController::print_version_specific_info(outputStream* st, julong phys_mem) {
354+
void CgroupV1MemoryController::print_version_specific_info(outputStream* st, julong mem_bound) {
355355
jlong kmem_usage = kernel_memory_usage_in_bytes();
356-
jlong kmem_limit = kernel_memory_limit_in_bytes(phys_mem);
356+
jlong kmem_limit = kernel_memory_limit_in_bytes(mem_bound);
357357
jlong kmem_max_usage = kernel_memory_max_usage_in_bytes();
358358

359359
OSContainer::print_container_helper(st, kmem_limit, "kernel_memory_limit_in_bytes");

src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,17 @@ class CgroupV1MemoryController final : public CgroupMemoryController {
7979
}
8080
jlong read_memory_limit_in_bytes(julong upper_bound) override;
8181
jlong memory_usage_in_bytes() override;
82-
jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) override;
83-
jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) override;
82+
jlong memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) override;
83+
jlong memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound) override;
8484
jlong memory_soft_limit_in_bytes(julong upper_bound) override;
8585
jlong memory_throttle_limit_in_bytes() override;
8686
jlong memory_max_usage_in_bytes() override;
8787
jlong rss_usage_in_bytes() override;
8888
jlong cache_usage_in_bytes() override;
8989
jlong kernel_memory_usage_in_bytes();
90-
jlong kernel_memory_limit_in_bytes(julong host_mem);
90+
jlong kernel_memory_limit_in_bytes(julong upper_bound);
9191
jlong kernel_memory_max_usage_in_bytes();
92-
void print_version_specific_info(outputStream* st, julong host_mem) override;
92+
void print_version_specific_info(outputStream* st, julong upper_mem_bound) override;
9393
bool needs_hierarchy_adjustment() override {
9494
return reader()->needs_hierarchy_adjustment();
9595
}
@@ -101,7 +101,7 @@ class CgroupV1MemoryController final : public CgroupMemoryController {
101101
const char* cgroup_path() override { return reader()->cgroup_path(); }
102102
private:
103103
jlong read_mem_swappiness();
104-
jlong read_mem_swap(julong host_total_memsw);
104+
jlong read_mem_swap(julong upper_memsw_bound);
105105

106106
public:
107107
CgroupV1MemoryController(const CgroupV1Controller& reader)

src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ jlong CgroupV2MemoryController::memory_usage_in_bytes() {
181181
return (jlong)memusage;
182182
}
183183

184-
jlong CgroupV2MemoryController::memory_soft_limit_in_bytes(julong phys_mem) {
184+
jlong CgroupV2MemoryController::memory_soft_limit_in_bytes(julong upper_bound) {
185185
jlong mem_soft_limit;
186186
CONTAINER_READ_NUMBER_CHECKED_MAX(reader(), "/memory.low", "Memory Soft Limit", mem_soft_limit);
187187
return mem_soft_limit;
@@ -224,19 +224,19 @@ jlong CgroupV2MemoryController::cache_usage_in_bytes() {
224224
// respectively. In order to properly report a cgroup v1 like
225225
// compound value we need to sum the two values. Setting a swap limit
226226
// without also setting a memory limit is not allowed.
227-
jlong CgroupV2MemoryController::memory_and_swap_limit_in_bytes(julong phys_mem,
228-
julong host_swap /* unused in cg v2 */) {
227+
jlong CgroupV2MemoryController::memory_and_swap_limit_in_bytes(julong upper_mem_bound,
228+
julong upper_swap_bound /* unused in cg v2 */) {
229229
jlong swap_limit;
230230
bool is_ok = reader()->read_number_handle_max("/memory.swap.max", &swap_limit);
231231
if (!is_ok) {
232232
// Some container tests rely on this trace logging to happen.
233233
log_trace(os, container)("Swap Limit failed: %d", OSCONTAINER_ERROR);
234234
// swap disabled at kernel level, treat it as no swap
235-
return read_memory_limit_in_bytes(phys_mem);
235+
return read_memory_limit_in_bytes(upper_mem_bound);
236236
}
237237
log_trace(os, container)("Swap Limit is: " JLONG_FORMAT, swap_limit);
238238
if (swap_limit >= 0) {
239-
jlong memory_limit = read_memory_limit_in_bytes(phys_mem);
239+
jlong memory_limit = read_memory_limit_in_bytes(upper_mem_bound);
240240
assert(memory_limit >= 0, "swap limit without memory limit?");
241241
return memory_limit + swap_limit;
242242
}
@@ -252,7 +252,7 @@ jlong memory_swap_current_value(CgroupV2Controller* ctrl) {
252252
return (jlong)swap_current;
253253
}
254254

255-
jlong CgroupV2MemoryController::memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) {
255+
jlong CgroupV2MemoryController::memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound) {
256256
jlong memory_usage = memory_usage_in_bytes();
257257
if (memory_usage >= 0) {
258258
jlong swap_current = memory_swap_current_value(reader());
@@ -276,7 +276,7 @@ jlong memory_limit_value(CgroupV2Controller* ctrl) {
276276
* memory limit in bytes or
277277
* -1 for unlimited, OSCONTAINER_ERROR for an error
278278
*/
279-
jlong CgroupV2MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
279+
jlong CgroupV2MemoryController::read_memory_limit_in_bytes(julong upper_bound) {
280280
jlong limit = memory_limit_value(reader());
281281
if (log_is_enabled(Trace, os, container)) {
282282
if (limit == -1) {
@@ -287,18 +287,18 @@ jlong CgroupV2MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
287287
}
288288
if (log_is_enabled(Debug, os, container)) {
289289
julong read_limit = (julong)limit; // avoid signed/unsigned compare
290-
if (limit < 0 || read_limit >= phys_mem) {
290+
if (limit < 0 || read_limit >= upper_bound) {
291291
const char* reason;
292292
if (limit == -1) {
293293
reason = "unlimited";
294294
} else if (limit == OSCONTAINER_ERROR) {
295295
reason = "failed";
296296
} else {
297-
assert(read_limit >= phys_mem, "Expected mem limit to exceed host memory");
297+
assert(read_limit >= upper_bound, "Expected mem limit to exceed upper memory bound");
298298
reason = "ignored";
299299
}
300-
log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT,
301-
reason, limit, phys_mem);
300+
log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", upper bound is " JLONG_FORMAT,
301+
reason, limit, upper_bound);
302302
}
303303
}
304304
return limit;
@@ -327,7 +327,7 @@ bool CgroupV2Controller::needs_hierarchy_adjustment() {
327327
return strcmp(_cgroup_path, "/") != 0;
328328
}
329329

330-
void CgroupV2MemoryController::print_version_specific_info(outputStream* st, julong phys_mem) {
330+
void CgroupV2MemoryController::print_version_specific_info(outputStream* st, julong upper_mem_bound) {
331331
jlong swap_current = memory_swap_current_value(reader());
332332
jlong swap_limit = memory_swap_limit_value(reader());
333333

src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,15 @@ class CgroupV2MemoryController final: public CgroupMemoryController {
115115
}
116116

117117
jlong read_memory_limit_in_bytes(julong upper_bound) override;
118-
jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swp) override;
119-
jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swp) override;
118+
jlong memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) override;
119+
jlong memory_and_swap_usage_in_bytes(julong upper_mem_bound, julong upper_swap_bound) override;
120120
jlong memory_soft_limit_in_bytes(julong upper_bound) override;
121121
jlong memory_throttle_limit_in_bytes() override;
122122
jlong memory_usage_in_bytes() override;
123123
jlong memory_max_usage_in_bytes() override;
124124
jlong rss_usage_in_bytes() override;
125125
jlong cache_usage_in_bytes() override;
126-
void print_version_specific_info(outputStream* st, julong host_mem) override;
126+
void print_version_specific_info(outputStream* st, julong upper_mem_bound) override;
127127
bool is_read_only() override {
128128
return reader()->is_read_only();
129129
}

0 commit comments

Comments
 (0)