mem_cgroup is checking available amount of memory the group can charge by calling the below function.
/** * mem_cgroup_margin - calculate chargeable space of a memory cgroup * @memcg: the memory cgroup * * Returns the maximum amount of memory @mem can be charged with, in * pages. */ static unsigned long mem_cgroup_margin(struct mem_cgroup *memcg) { unsigned long margin = 0; unsigned long count; unsigned long limit; count = page_counter_read(&memcg->memory); limit = ACCESS_ONCE(memcg->memory.limit); if (count memsw); limit = ACCESS_ONCE(memcg->memsw.limit); if (count <= limit) margin = min(margin, limit - count); } return margin; }
In the below example, it can charge 32 (128KB) more pages. Even though do_swap_account was on, it can’t use mews as ‘counter’ value is bigger than limit.
crash> mem_cgroup.memory,memsw 0xffff9b34e4856000 memory = { count = { counter = 0x3ffe0 }, limit = 0x40000, parent = 0xffff9b3cde6c5848, watermark = 0x40095, failcnt = 0x2f759ae } memsw = { count = { counter = 0x80002 }, limit = 0x80000, parent = 0xffff9b3cde6c5908, watermark = 0x80006, failcnt = 0x1a8484d } crash> p do_swap_account do_swap_account = $15 = 0x1 crash> pd 0x40000-0x3ffe0 $16 = 32
Leave a Reply