|
@@ -3637,6 +3637,34 @@ __memcg_kmem_newpage_charge(gfp_t gfp, struct mem_cgroup **_memcg, int order)
|
|
|
int ret;
|
|
|
|
|
|
*_memcg = NULL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Disabling accounting is only relevant for some specific memcg
|
|
|
+ * internal allocations. Therefore we would initially not have such
|
|
|
+ * check here, since direct calls to the page allocator that are marked
|
|
|
+ * with GFP_KMEMCG only happen outside memcg core. We are mostly
|
|
|
+ * concerned with cache allocations, and by having this test at
|
|
|
+ * memcg_kmem_get_cache, we are already able to relay the allocation to
|
|
|
+ * the root cache and bypass the memcg cache altogether.
|
|
|
+ *
|
|
|
+ * There is one exception, though: the SLUB allocator does not create
|
|
|
+ * large order caches, but rather service large kmallocs directly from
|
|
|
+ * the page allocator. Therefore, the following sequence when backed by
|
|
|
+ * the SLUB allocator:
|
|
|
+ *
|
|
|
+ * memcg_stop_kmem_account();
|
|
|
+ * kmalloc(<large_number>)
|
|
|
+ * memcg_resume_kmem_account();
|
|
|
+ *
|
|
|
+ * would effectively ignore the fact that we should skip accounting,
|
|
|
+ * since it will drive us directly to this function without passing
|
|
|
+ * through the cache selector memcg_kmem_get_cache. Such large
|
|
|
+ * allocations are extremely rare but can happen, for instance, for the
|
|
|
+ * cache arrays. We bring this test here.
|
|
|
+ */
|
|
|
+ if (!current->mm || current->memcg_kmem_skip_account)
|
|
|
+ return true;
|
|
|
+
|
|
|
memcg = try_get_mem_cgroup_from_mm(current->mm);
|
|
|
|
|
|
/*
|