Commit e88cc05b authored by Roman Gushchin's avatar Roman Gushchin Committed by Alexei Starovoitov

bpf: Refine memcg-based memory accounting for cpumap maps

Include metadata and percpu data into the memcg-based memory
accounting.
Signed-off-by: default avatarRoman Gushchin <guro@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20201201215900.3569844-10-guro@fb.com
parent 6d192c79
...@@ -97,7 +97,7 @@ static struct bpf_map *cpu_map_alloc(union bpf_attr *attr) ...@@ -97,7 +97,7 @@ static struct bpf_map *cpu_map_alloc(union bpf_attr *attr)
attr->map_flags & ~BPF_F_NUMA_NODE) attr->map_flags & ~BPF_F_NUMA_NODE)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
cmap = kzalloc(sizeof(*cmap), GFP_USER); cmap = kzalloc(sizeof(*cmap), GFP_USER | __GFP_ACCOUNT);
if (!cmap) if (!cmap)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -412,7 +412,8 @@ static int __cpu_map_load_bpf_program(struct bpf_cpu_map_entry *rcpu, int fd) ...@@ -412,7 +412,8 @@ static int __cpu_map_load_bpf_program(struct bpf_cpu_map_entry *rcpu, int fd)
} }
static struct bpf_cpu_map_entry * static struct bpf_cpu_map_entry *
__cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id) __cpu_map_entry_alloc(struct bpf_map *map, struct bpf_cpumap_val *value,
u32 cpu)
{ {
int numa, err, i, fd = value->bpf_prog.fd; int numa, err, i, fd = value->bpf_prog.fd;
gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
...@@ -422,13 +423,13 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id) ...@@ -422,13 +423,13 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id)
/* Have map->numa_node, but choose node of redirect target CPU */ /* Have map->numa_node, but choose node of redirect target CPU */
numa = cpu_to_node(cpu); numa = cpu_to_node(cpu);
rcpu = kzalloc_node(sizeof(*rcpu), gfp, numa); rcpu = bpf_map_kmalloc_node(map, sizeof(*rcpu), gfp | __GFP_ZERO, numa);
if (!rcpu) if (!rcpu)
return NULL; return NULL;
/* Alloc percpu bulkq */ /* Alloc percpu bulkq */
rcpu->bulkq = __alloc_percpu_gfp(sizeof(*rcpu->bulkq), rcpu->bulkq = bpf_map_alloc_percpu(map, sizeof(*rcpu->bulkq),
sizeof(void *), gfp); sizeof(void *), gfp);
if (!rcpu->bulkq) if (!rcpu->bulkq)
goto free_rcu; goto free_rcu;
...@@ -438,7 +439,8 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id) ...@@ -438,7 +439,8 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id)
} }
/* Alloc queue */ /* Alloc queue */
rcpu->queue = kzalloc_node(sizeof(*rcpu->queue), gfp, numa); rcpu->queue = bpf_map_kmalloc_node(map, sizeof(*rcpu->queue), gfp,
numa);
if (!rcpu->queue) if (!rcpu->queue)
goto free_bulkq; goto free_bulkq;
...@@ -447,7 +449,7 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id) ...@@ -447,7 +449,7 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id)
goto free_queue; goto free_queue;
rcpu->cpu = cpu; rcpu->cpu = cpu;
rcpu->map_id = map_id; rcpu->map_id = map->id;
rcpu->value.qsize = value->qsize; rcpu->value.qsize = value->qsize;
if (fd > 0 && __cpu_map_load_bpf_program(rcpu, fd)) if (fd > 0 && __cpu_map_load_bpf_program(rcpu, fd))
...@@ -455,7 +457,8 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id) ...@@ -455,7 +457,8 @@ __cpu_map_entry_alloc(struct bpf_cpumap_val *value, u32 cpu, int map_id)
/* Setup kthread */ /* Setup kthread */
rcpu->kthread = kthread_create_on_node(cpu_map_kthread_run, rcpu, numa, rcpu->kthread = kthread_create_on_node(cpu_map_kthread_run, rcpu, numa,
"cpumap/%d/map:%d", cpu, map_id); "cpumap/%d/map:%d", cpu,
map->id);
if (IS_ERR(rcpu->kthread)) if (IS_ERR(rcpu->kthread))
goto free_prog; goto free_prog;
...@@ -571,7 +574,7 @@ static int cpu_map_update_elem(struct bpf_map *map, void *key, void *value, ...@@ -571,7 +574,7 @@ static int cpu_map_update_elem(struct bpf_map *map, void *key, void *value,
rcpu = NULL; /* Same as deleting */ rcpu = NULL; /* Same as deleting */
} else { } else {
/* Updating qsize cause re-allocation of bpf_cpu_map_entry */ /* Updating qsize cause re-allocation of bpf_cpu_map_entry */
rcpu = __cpu_map_entry_alloc(&cpumap_value, key_cpu, map->id); rcpu = __cpu_map_entry_alloc(map, &cpumap_value, key_cpu);
if (!rcpu) if (!rcpu)
return -ENOMEM; return -ENOMEM;
rcpu->cmap = cmap; rcpu->cmap = cmap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment