<div dir="ltr"><div><div><div>When unlimited UBC is created next code is performed in mem_cgroup_apply_beancounter:<br><br>        mem = ub-&gt;ub_parms[UB_PHYSPAGES].limit;<br>        memsw = ub-&gt;ub_parms[UB_SWAPPAGES].limit;<br><br>        if (memsw &lt; PAGE_COUNTER_MAX - mem)<br>                memsw += mem;<br>    else<br>                memsw = PAGE_COUNTER_MAX;<br><br>If mem == memsw == UB_MAXVALUE == 9223372036854775807, the condition if (memsw &lt; PAGE_COUNTER_MAX - mem) will be true,<br>due to (LONG_MAX/PAGE_SIZE - LONG_MAX) &gt; LONG_MAX and memsw is unsigned long long.<br>Then we add 9223372036854775807 + 9223372036854775807, and this leads to overflow, and as a result we have unsigned long memcg-&gt;memsw.limit==18446744073709551614, or -2 for long type variable.<br><br>The value memsw==18446744073709551614 is used in mem_cgroup_enough_memory to calculate variable free:<br><br>    long free = memcg-&gt;memsw.limit - page_counter_read(&amp;memcg-&gt;memsw);<br><br>Due to type &#39;long&#39; memcg-&gt;memsw.limit == -2 (18446744073709551614), and the function returns -ENOMEM despite of unlimited UBC.<br><br>Could you please check the condition if (memsw &lt; PAGE_COUNTER_MAX - mem) ? It&#39;s pretty strange to compare LONG_MAX/PAGE_SIZE and LONG_MAX values.<br><br>--<br></div>Best regards,<br></div>Vladimir Meshkov,<br></div>CloudLinux kernel team<br></div>