Currently some allocations can silently bypass accounting to root memcg. This happen for __GFP_ACCOUNT allocations and if current task got fatal signal. In vz8 and upstream this check was removed, and such allocations are accounted to specified memcg without any limits.
I hope this helps to prevent global OOM in few threads inide limited container got fatal signals and by this way got approval for unlimited host memory allocations. https://jira.sw.ru/browse/PSBM-132705 Signed-off-by: Vasily Averin <[email protected]> --- include/linux/memcontrol.h | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f609a15..cffdd62 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -639,21 +639,9 @@ memcg_kmem_newpage_charge(struct page *page, gfp_t gfp, int order) if (!(gfp & __GFP_ACCOUNT)) return true; - /* - * __GFP_NOFAIL allocations will move on even if charging is not - * possible. Therefore we don't even try, and have this allocation - * unaccounted. We could in theory charge it forcibly, but we hope - * those allocations are rare, and won't be worth the trouble. - */ - if (gfp & __GFP_NOFAIL) - return true; if (!in_task() || (!current->mm) || (current->flags & PF_KTHREAD)) return true; - /* If the test is dying, just let it go. */ - if (unlikely(fatal_signal_pending(current))) - return true; - return __memcg_kmem_newpage_charge(page, gfp, order); } @@ -683,12 +671,9 @@ memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp) { if (!memcg_kmem_enabled()) return cachep; - if (gfp & __GFP_NOFAIL) - return cachep; + if (!in_task() || (!current->mm) || (current->flags & PF_KTHREAD)) return cachep; - if (unlikely(fatal_signal_pending(current))) - return cachep; return __memcg_kmem_get_cache(cachep, gfp); } -- 1.8.3.1 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
