Migrate sockmap and sockhash to use map_copy_value instead of map_lookup_elem_sys_only. Signed-off-by: Lorenz Bauer <lmb@xxxxxxxxxxxxxx> --- net/core/sock_map.c | 48 ++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/net/core/sock_map.c b/net/core/sock_map.c index a7075b3b4489..03e04426cd21 100644 --- a/net/core/sock_map.c +++ b/net/core/sock_map.c @@ -344,19 +344,34 @@ static void *sock_map_lookup(struct bpf_map *map, void *key) return __sock_map_lookup_elem(map, *(u32 *)key); } -static void *sock_map_lookup_sys(struct bpf_map *map, void *key) +static int __sock_map_copy_value(struct bpf_map *map, struct sock *sk, + void *value) +{ + switch (map->value_size) { + case sizeof(u64): + sock_gen_cookie(sk); + *(u64 *)value = atomic64_read(&sk->sk_cookie); + return 0; + + default: + return -ENOSPC; + } +} + +static int sock_map_copy_value(struct bpf_map *map, void *key, void *value) { struct sock *sk; + int ret = -ENOENT; - if (map->value_size != sizeof(u64)) - return ERR_PTR(-ENOSPC); - + rcu_read_lock(); sk = __sock_map_lookup_elem(map, *(u32 *)key); if (!sk) - return ERR_PTR(-ENOENT); + goto out; - sock_gen_cookie(sk); - return &sk->sk_cookie; + ret = __sock_map_copy_value(map, sk, value); +out: + rcu_read_unlock(); + return ret; } static int __sock_map_delete(struct bpf_stab *stab, struct sock *sk_test, @@ -636,7 +651,7 @@ const struct bpf_map_ops sock_map_ops = { .map_alloc = sock_map_alloc, .map_free = sock_map_free, .map_get_next_key = sock_map_get_next_key, - .map_lookup_elem_sys_only = sock_map_lookup_sys, + .map_copy_value = sock_map_copy_value, .map_update_elem = sock_map_update_elem, .map_delete_elem = sock_map_delete_elem, .map_lookup_elem = sock_map_lookup, @@ -1030,19 +1045,20 @@ static void sock_hash_free(struct bpf_map *map) kfree(htab); } -static void *sock_hash_lookup_sys(struct bpf_map *map, void *key) +static int sock_hash_copy_value(struct bpf_map *map, void *key, void *value) { struct sock *sk; + int ret = -ENOENT; - if (map->value_size != sizeof(u64)) - return ERR_PTR(-ENOSPC); - + rcu_read_lock(); sk = __sock_hash_lookup_elem(map, key); if (!sk) - return ERR_PTR(-ENOENT); + goto out; - sock_gen_cookie(sk); - return &sk->sk_cookie; + ret = __sock_map_copy_value(map, sk, value); +out: + rcu_read_unlock(); + return ret; } static void *sock_hash_lookup(struct bpf_map *map, void *key) @@ -1139,7 +1155,7 @@ const struct bpf_map_ops sock_hash_ops = { .map_update_elem = sock_hash_update_elem, .map_delete_elem = sock_hash_delete_elem, .map_lookup_elem = sock_hash_lookup, - .map_lookup_elem_sys_only = sock_hash_lookup_sys, + .map_copy_value = sock_hash_copy_value, .map_release_uref = sock_hash_release_progs, .map_check_btf = map_check_no_btf, }; -- 2.20.1