diff mbox series

[bpf] bpf: Fix memlock accounting for sock_hash

Message ID 20200612000857.2881453-1-rdna@fb.com
State Accepted
Delegated to: BPF Maintainers
Headers show
Series [bpf] bpf: Fix memlock accounting for sock_hash | expand

Commit Message

Andrey Ignatov June 12, 2020, 12:08 a.m. UTC
Add missed bpf_map_charge_init() in sock_hash_alloc() and
correspondingly bpf_map_charge_finish() on ENOMEM.

It was found accidentally while working on unrelated selftest that
checks "map->memory.pages > 0" is true for all map types.

Before:
	# bpftool m l
	...
	3692: sockhash  name m_sockhash  flags 0x0
		key 4B  value 4B  max_entries 8  memlock 0B

After:
	# bpftool m l
	...
	84: sockmap  name m_sockmap  flags 0x0
		key 4B  value 4B  max_entries 8  memlock 4096B

Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
Signed-off-by: Andrey Ignatov <rdna@fb.com>
---
 net/core/sock_map.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Alexei Starovoitov June 12, 2020, 10:26 p.m. UTC | #1
On Thu, Jun 11, 2020 at 5:09 PM Andrey Ignatov <rdna@fb.com> wrote:
>
> Add missed bpf_map_charge_init() in sock_hash_alloc() and
> correspondingly bpf_map_charge_finish() on ENOMEM.
>
> It was found accidentally while working on unrelated selftest that
> checks "map->memory.pages > 0" is true for all map types.
>
> Before:
>         # bpftool m l
>         ...
>         3692: sockhash  name m_sockhash  flags 0x0
>                 key 4B  value 4B  max_entries 8  memlock 0B
>
> After:
>         # bpftool m l
>         ...
>         84: sockmap  name m_sockmap  flags 0x0
>                 key 4B  value 4B  max_entries 8  memlock 4096B
>
> Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
> Signed-off-by: Andrey Ignatov <rdna@fb.com>

That's a nasty one. Good catch.
Applied.
diff mbox series

Patch

diff --git a/net/core/sock_map.c b/net/core/sock_map.c
index 17a40a947546..3a2dc6af1d78 100644
--- a/net/core/sock_map.c
+++ b/net/core/sock_map.c
@@ -989,11 +989,15 @@  static struct bpf_map *sock_hash_alloc(union bpf_attr *attr)
 		err = -EINVAL;
 		goto free_htab;
 	}
+	err = bpf_map_charge_init(&htab->map.memory, cost);
+	if (err)
+		goto free_htab;
 
 	htab->buckets = bpf_map_area_alloc(htab->buckets_num *
 					   sizeof(struct bpf_htab_bucket),
 					   htab->map.numa_node);
 	if (!htab->buckets) {
+		bpf_map_charge_finish(&htab->map.memory);
 		err = -ENOMEM;
 		goto free_htab;
 	}