Merge branch 'allow-bpf_map_sum_elem_count-for-all-program-types'
Anton Protopopov says: ==================== allow bpf_map_sum_elem_count for all program types This series is a follow up to the recent change [1] which added per-cpu insert/delete statistics for maps. The bpf_map_sum_elem_count kfunc presented in the original series was only available to tracing programs, so let's make it available to all. The first patch makes types listed in the reg2btf_ids[] array to be considered trusted by kfuncs. The second patch allows to treat CONST_PTR_TO_MAP as trusted pointers from kfunc's point of view by adding it to the reg2btf_ids[] array. The third patch adds missing const to the map argument of the bpf_map_sum_elem_count kfunc. The fourth patch registers the bpf_map_sum_elem_count for all programs, and patches selftests correspondingly. [1] https://lore.kernel.org/bpf/20230705160139.19967-1-aspsk@isovalent.com/ v1 -> v2: * treat the whole reg2btf_ids array as trusted (Alexei) ==================== Link: https://lore.kernel.org/r/20230719092952.41202-1-aspsk@isovalent.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
commit
9df76fe0c5
@ -267,5 +267,6 @@ MAX_BTF_TRACING_TYPE,
|
||||
extern u32 btf_tracing_ids[];
|
||||
extern u32 bpf_cgroup_btf_id[];
|
||||
extern u32 bpf_local_storage_map_btf_id[];
|
||||
extern u32 btf_bpf_map_id[];
|
||||
|
||||
#endif
|
||||
|
@ -78,8 +78,7 @@ static const struct seq_operations bpf_map_seq_ops = {
|
||||
.show = bpf_map_seq_show,
|
||||
};
|
||||
|
||||
BTF_ID_LIST(btf_bpf_map_id)
|
||||
BTF_ID(struct, bpf_map)
|
||||
BTF_ID_LIST_GLOBAL_SINGLE(btf_bpf_map_id, struct, bpf_map)
|
||||
|
||||
static const struct bpf_iter_seq_info bpf_map_seq_info = {
|
||||
.seq_ops = &bpf_map_seq_ops,
|
||||
@ -198,7 +197,7 @@ __diag_push();
|
||||
__diag_ignore_all("-Wmissing-prototypes",
|
||||
"Global functions as their definitions will be in vmlinux BTF");
|
||||
|
||||
__bpf_kfunc s64 bpf_map_sum_elem_count(struct bpf_map *map)
|
||||
__bpf_kfunc s64 bpf_map_sum_elem_count(const struct bpf_map *map)
|
||||
{
|
||||
s64 *pcount;
|
||||
s64 ret = 0;
|
||||
@ -227,6 +226,6 @@ static const struct btf_kfunc_id_set bpf_map_iter_kfunc_set = {
|
||||
|
||||
static int init_subsystem(void)
|
||||
{
|
||||
return register_btf_kfunc_id_set(BPF_PROG_TYPE_TRACING, &bpf_map_iter_kfunc_set);
|
||||
return register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, &bpf_map_iter_kfunc_set);
|
||||
}
|
||||
late_initcall(init_subsystem);
|
||||
|
@ -5413,12 +5413,25 @@ static bool is_flow_key_reg(struct bpf_verifier_env *env, int regno)
|
||||
return reg->type == PTR_TO_FLOW_KEYS;
|
||||
}
|
||||
|
||||
static u32 *reg2btf_ids[__BPF_REG_TYPE_MAX] = {
|
||||
#ifdef CONFIG_NET
|
||||
[PTR_TO_SOCKET] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK],
|
||||
[PTR_TO_SOCK_COMMON] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK_COMMON],
|
||||
[PTR_TO_TCP_SOCK] = &btf_sock_ids[BTF_SOCK_TYPE_TCP],
|
||||
#endif
|
||||
[CONST_PTR_TO_MAP] = btf_bpf_map_id,
|
||||
};
|
||||
|
||||
static bool is_trusted_reg(const struct bpf_reg_state *reg)
|
||||
{
|
||||
/* A referenced register is always trusted. */
|
||||
if (reg->ref_obj_id)
|
||||
return true;
|
||||
|
||||
/* Types listed in the reg2btf_ids are always trusted */
|
||||
if (reg2btf_ids[base_type(reg->type)])
|
||||
return true;
|
||||
|
||||
/* If a register is not referenced, it is trusted if it has the
|
||||
* MEM_ALLOC or PTR_TRUSTED type modifiers, and no others. Some of the
|
||||
* other type modifiers may be safe, but we elect to take an opt-in
|
||||
@ -10052,15 +10065,6 @@ static bool __btf_type_is_scalar_struct(struct bpf_verifier_env *env,
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static u32 *reg2btf_ids[__BPF_REG_TYPE_MAX] = {
|
||||
#ifdef CONFIG_NET
|
||||
[PTR_TO_SOCKET] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK],
|
||||
[PTR_TO_SOCK_COMMON] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK_COMMON],
|
||||
[PTR_TO_TCP_SOCK] = &btf_sock_ids[BTF_SOCK_TYPE_TCP],
|
||||
#endif
|
||||
};
|
||||
|
||||
enum kfunc_ptr_arg_type {
|
||||
KF_ARG_PTR_TO_CTX,
|
||||
KF_ARG_PTR_TO_ALLOC_BTF_ID, /* Allocated object */
|
||||
|
@ -103,6 +103,8 @@ struct {
|
||||
__type(value, __u32);
|
||||
} m_hash SEC(".maps");
|
||||
|
||||
__s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym;
|
||||
|
||||
static inline int check_hash(void)
|
||||
{
|
||||
struct bpf_htab *hash = (struct bpf_htab *)&m_hash;
|
||||
@ -115,6 +117,8 @@ static inline int check_hash(void)
|
||||
VERIFY(hash->elem_size == 64);
|
||||
|
||||
VERIFY(hash->count.counter == 0);
|
||||
VERIFY(bpf_map_sum_elem_count(map) == 0);
|
||||
|
||||
for (i = 0; i < HALF_ENTRIES; ++i) {
|
||||
const __u32 key = i;
|
||||
const __u32 val = 1;
|
||||
@ -123,6 +127,7 @@ static inline int check_hash(void)
|
||||
return 0;
|
||||
}
|
||||
VERIFY(hash->count.counter == HALF_ENTRIES);
|
||||
VERIFY(bpf_map_sum_elem_count(map) == HALF_ENTRIES);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user