summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Gushchin <guro@fb.com>2020-12-01 13:58:33 -0800
committerAlexei Starovoitov <ast@kernel.org>2020-12-02 18:32:45 -0800
commitd5299b67dd59445902cd30cbc60a03c869cf1adb (patch)
tree8da721c013c8ad952eeacae9ac6bf67e531cfac6
parent48edc1f78aabeba35ed00e40c36f211de89e0090 (diff)
downloadlinux-stable-d5299b67dd59445902cd30cbc60a03c869cf1adb.tar.gz
linux-stable-d5299b67dd59445902cd30cbc60a03c869cf1adb.tar.bz2
linux-stable-d5299b67dd59445902cd30cbc60a03c869cf1adb.zip
bpf: Memcg-based memory accounting for bpf maps
This patch enables memcg-based memory accounting for memory allocated by __bpf_map_area_alloc(), which is used by many types of bpf maps for large initial memory allocations. Please note, that __bpf_map_area_alloc() should not be used outside of map creation paths without setting the active memory cgroup to the map's memory cgroup. Following patches in the series will refine the accounting for some of the map types. Signed-off-by: Roman Gushchin <guro@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20201201215900.3569844-8-guro@fb.com
-rw-r--r--kernel/bpf/syscall.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index dedbf6d4cd84..dff3a5f62d7a 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -268,6 +268,10 @@ static int bpf_map_copy_value(struct bpf_map *map, void *key, void *value,
return err;
}
+/* Please, do not use this function outside from the map creation path
+ * (e.g. in map update path) without taking care of setting the active
+ * memory cgroup (see at bpf_map_kmalloc_node() for example).
+ */
static void *__bpf_map_area_alloc(u64 size, int numa_node, bool mmapable)
{
/* We really just want to fail instead of triggering OOM killer
@@ -280,7 +284,7 @@ static void *__bpf_map_area_alloc(u64 size, int numa_node, bool mmapable)
* __GFP_RETRY_MAYFAIL to avoid such situations.
*/
- const gfp_t gfp = __GFP_NOWARN | __GFP_ZERO;
+ const gfp_t gfp = __GFP_NOWARN | __GFP_ZERO | __GFP_ACCOUNT;
unsigned int flags = 0;
unsigned long align = 1;
void *area;