static int swap_use_force_reclaim(char *memcg)
{
- int ret;
+ int ret, len;
int try = SWAP_FORCE_RECLAIM_NUM_MAX;
- unsigned int usage, usage_after_reclaim, nr_to_reclaim;
+ unsigned int usage, nr_to_reclaim;
+ unsigned int total_reclaim = 0;
+ bool root_memcg = false;
+
+ /*
+ * In case of LOWMEM_ROOT_CGROUP,
+ * it is no necessary to check anon usage of memcg
+ * because it doesn't include all memory usage.
+ * But instead, try to swap memory as much as possible.
+ * It will be happend only once after booting done.
+ */
+ len = strlen(memcg);
+ if (!strncmp(memcg, LOWMEM_ROOT_CGROUP, len))
+ root_memcg = true;
do {
/*
* For this reason it's better to use '.stat' and calculate only
* anoynymous memory usage.
*/
- ret = memcg_get_anon_usage(memcg, &usage);
+ if (root_memcg)
+ ret = cgroup_read_node_uint32(memcg, MEMCG_USAGE, &usage);
+ else
+ ret = memcg_get_anon_usage(memcg, &usage);
+
if (ret != RESOURCED_ERROR_NONE)
usage = 0;
if (nr_to_reclaim > SWAP_RECLIAM_PAGES_MAX)
nr_to_reclaim = SWAP_RECLIAM_PAGES_MAX;
+ total_reclaim += nr_to_reclaim;
ret = cgroup_write_node_uint32(memcg, SWAPCG_RECLAIM,
nr_to_reclaim);
if (ret != RESOURCED_ERROR_NONE)
break; /* if we can't reclaim don't continue */
- ret = memcg_get_anon_usage(memcg, &usage_after_reclaim);
- if (ret != RESOURCED_ERROR_NONE)
- usage_after_reclaim = 0;
-
- if (usage_after_reclaim >= usage)
- break; /* if we didn't reclaim more, let's stop */
-
- _D("FORCE_RECLAIM try: %d, before: %d, after: %d",
- try, usage, usage_after_reclaim);
try -= 1;
} while (try > 0);
+ _D("FORCE_RECLAIM tried %u pages from %s", total_reclaim, memcg);
return ret;
}