}
int unit_get_memory_available(Unit *u, uint64_t *ret) {
- uint64_t available = UINT64_MAX;
- int r;
+ uint64_t available = UINT64_MAX, current = 0;
assert(u);
assert(ret);
* and MemoryMax, and also any slice the unit might be nested below. */
do {
- uint64_t unit_current, unit_available, unit_limit = UINT64_MAX;
+ uint64_t unit_available, unit_limit = UINT64_MAX;
CGroupContext *unit_context;
/* No point in continuing if we can't go any lower */
if (!u->cgroup_path)
continue;
+ (void) unit_get_memory_current(u, ¤t);
+ /* in case of error, previous current propagates as lower bound */
+
if (unit_has_name(u, SPECIAL_ROOT_SLICE))
unit_limit = physical_memory();
else if (unit_context->memory_max == UINT64_MAX && unit_context->memory_high == UINT64_MAX)
continue;
unit_limit = MIN3(unit_limit, unit_context->memory_max, unit_context->memory_high);
- r = unit_get_memory_current(u, &unit_current);
- if (r < 0)
- continue;
-
- unit_available = LESS_BY(unit_limit, unit_current);
+ unit_available = LESS_BY(unit_limit, current);
available = MIN(unit_available, available);
} while ((u = UNIT_GET_SLICE(u)));