diff options
Diffstat (limited to 'kernel/bpf/map_iter.c')
| -rw-r--r-- | kernel/bpf/map_iter.c | 42 | 
1 files changed, 39 insertions, 3 deletions
diff --git a/kernel/bpf/map_iter.c b/kernel/bpf/map_iter.c index b0fa190b0979..6fc9dae9edc8 100644 --- a/kernel/bpf/map_iter.c +++ b/kernel/bpf/map_iter.c @@ -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, @@ -93,7 +92,7 @@ static struct bpf_iter_reg bpf_map_reg_info = {  	.ctx_arg_info_size	= 1,  	.ctx_arg_info		= {  		{ offsetof(struct bpf_iter__bpf_map, map), -		  PTR_TO_BTF_ID_OR_NULL }, +		  PTR_TO_BTF_ID_OR_NULL | PTR_TRUSTED },  	},  	.seq_info		= &bpf_map_seq_info,  }; @@ -193,3 +192,40 @@ static int __init bpf_map_iter_init(void)  }  late_initcall(bpf_map_iter_init); + +__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(const struct bpf_map *map) +{ +	s64 *pcount; +	s64 ret = 0; +	int cpu; + +	if (!map || !map->elem_count) +		return 0; + +	for_each_possible_cpu(cpu) { +		pcount = per_cpu_ptr(map->elem_count, cpu); +		ret += READ_ONCE(*pcount); +	} +	return ret; +} + +__diag_pop(); + +BTF_SET8_START(bpf_map_iter_kfunc_ids) +BTF_ID_FLAGS(func, bpf_map_sum_elem_count, KF_TRUSTED_ARGS) +BTF_SET8_END(bpf_map_iter_kfunc_ids) + +static const struct btf_kfunc_id_set bpf_map_iter_kfunc_set = { +	.owner = THIS_MODULE, +	.set   = &bpf_map_iter_kfunc_ids, +}; + +static int init_subsystem(void) +{ +	return register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, &bpf_map_iter_kfunc_set); +} +late_initcall(init_subsystem);  | 
