forked from luck/tmp_suning_uos_patched
bpf: add map_lookup_elem_sys_only for lookups from syscall side
Add a callback map_lookup_elem_sys_only() that map implementations could use over map_lookup_elem() from system call side in case the map implementation needs to handle the latter differently than from the BPF data path. If map_lookup_elem_sys_only() is set, this will be preferred pick for map lookups out of user space. This hook is used in a follow-up fix for LRU map, but once development window opens, we can convert other map types from map_lookup_elem() (here, the one called upon BPF_MAP_LOOKUP_ELEM cmd is meant) over to use the callback to simplify and clean up the latter. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
2474c62898
commit
c6110222c6
|
@ -36,6 +36,7 @@ struct bpf_map_ops {
|
||||||
void (*map_free)(struct bpf_map *map);
|
void (*map_free)(struct bpf_map *map);
|
||||||
int (*map_get_next_key)(struct bpf_map *map, void *key, void *next_key);
|
int (*map_get_next_key)(struct bpf_map *map, void *key, void *next_key);
|
||||||
void (*map_release_uref)(struct bpf_map *map);
|
void (*map_release_uref)(struct bpf_map *map);
|
||||||
|
void *(*map_lookup_elem_sys_only)(struct bpf_map *map, void *key);
|
||||||
|
|
||||||
/* funcs callable from userspace and from eBPF programs */
|
/* funcs callable from userspace and from eBPF programs */
|
||||||
void *(*map_lookup_elem)(struct bpf_map *map, void *key);
|
void *(*map_lookup_elem)(struct bpf_map *map, void *key);
|
||||||
|
|
|
@ -808,6 +808,9 @@ static int map_lookup_elem(union bpf_attr *attr)
|
||||||
err = map->ops->map_peek_elem(map, value);
|
err = map->ops->map_peek_elem(map, value);
|
||||||
} else {
|
} else {
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
if (map->ops->map_lookup_elem_sys_only)
|
||||||
|
ptr = map->ops->map_lookup_elem_sys_only(map, key);
|
||||||
|
else
|
||||||
ptr = map->ops->map_lookup_elem(map, key);
|
ptr = map->ops->map_lookup_elem(map, key);
|
||||||
if (IS_ERR(ptr)) {
|
if (IS_ERR(ptr)) {
|
||||||
err = PTR_ERR(ptr);
|
err = PTR_ERR(ptr);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user