We can simply set root memcg as the map's memcg to disable bpf memory
accounting. bpf_map_area_alloc is a little special as it gets the memcg
from current rather than from the map, so we need to disable GFP_ACCOUNT
specifically for it.
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Roman Gushchin <roman.gushchin@linux.dev>
Link: https://lore.kernel.org/r/20230210154734.4416-4-laoar.shao@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
 
 #include <linux/btf.h>
 #include <linux/rcupdate_trace.h>
 #include <linux/static_call.h>
+#include <linux/memcontrol.h>
 
 struct bpf_verifier_env;
 struct bpf_verifier_log;
        return type & MEM_ALLOC;
 }
 
+static inline gfp_t bpf_memcg_flags(gfp_t flags)
+{
+       if (memcg_bpf_enabled())
+               return flags | __GFP_ACCOUNT;
+       return flags;
+}
+
 #endif /* _LINUX_BPF_H */
 
                unit_size = size;
 
 #ifdef CONFIG_MEMCG_KMEM
-               objcg = get_obj_cgroup_from_current();
+               if (memcg_bpf_enabled())
+                       objcg = get_obj_cgroup_from_current();
 #endif
                for_each_possible_cpu(cpu) {
                        c = per_cpu_ptr(pc, cpu);
 
         * __GFP_RETRY_MAYFAIL to avoid such situations.
         */
 
-       const gfp_t gfp = __GFP_NOWARN | __GFP_ZERO | __GFP_ACCOUNT;
+       gfp_t gfp = bpf_memcg_flags(__GFP_NOWARN | __GFP_ZERO);
        unsigned int flags = 0;
        unsigned long align = 1;
        void *area;
         * So we have to check map->objcg for being NULL each time it's
         * being used.
         */
-       map->objcg = get_obj_cgroup_from_current();
+       if (memcg_bpf_enabled())
+               map->objcg = get_obj_cgroup_from_current();
 }
 
 static void bpf_map_release_memcg(struct bpf_map *map)