bpf, net: bpf_local_storage memory usage
A new helper is introduced into bpf_local_storage map to calculate the memory usage. This helper is also used by other maps like bpf_cgrp_storage, bpf_inode_storage, bpf_task_storage and etc. Note that currently the dynamically allocated storage elements are not counted in the usage, since it will take extra runtime overhead in the elements update or delete path. So let's put it aside now, and implement it in the future when someone really need it. Signed-off-by: Yafang Shao <laoar.shao@gmail.com> Link: https://lore.kernel.org/r/20230305124615.12358-15-laoar.shao@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Родитель
2f536977d6
Коммит
7490b7f1c0
|
@ -164,5 +164,6 @@ bpf_local_storage_update(void *owner, struct bpf_local_storage_map *smap,
|
|||
void *value, u64 map_flags, gfp_t gfp_flags);
|
||||
|
||||
void bpf_local_storage_free_rcu(struct rcu_head *rcu);
|
||||
u64 bpf_local_storage_map_mem_usage(const struct bpf_map *map);
|
||||
|
||||
#endif /* _BPF_LOCAL_STORAGE_H */
|
||||
|
|
|
@ -221,6 +221,7 @@ const struct bpf_map_ops cgrp_storage_map_ops = {
|
|||
.map_update_elem = bpf_cgrp_storage_update_elem,
|
||||
.map_delete_elem = bpf_cgrp_storage_delete_elem,
|
||||
.map_check_btf = bpf_local_storage_map_check_btf,
|
||||
.map_mem_usage = bpf_local_storage_map_mem_usage,
|
||||
.map_btf_id = &bpf_local_storage_map_btf_id[0],
|
||||
.map_owner_storage_ptr = cgroup_storage_ptr,
|
||||
};
|
||||
|
|
|
@ -223,6 +223,7 @@ const struct bpf_map_ops inode_storage_map_ops = {
|
|||
.map_update_elem = bpf_fd_inode_storage_update_elem,
|
||||
.map_delete_elem = bpf_fd_inode_storage_delete_elem,
|
||||
.map_check_btf = bpf_local_storage_map_check_btf,
|
||||
.map_mem_usage = bpf_local_storage_map_mem_usage,
|
||||
.map_btf_id = &bpf_local_storage_map_btf_id[0],
|
||||
.map_owner_storage_ptr = inode_storage_ptr,
|
||||
};
|
||||
|
|
|
@ -685,6 +685,16 @@ bool bpf_local_storage_unlink_nolock(struct bpf_local_storage *local_storage)
|
|||
return free_storage;
|
||||
}
|
||||
|
||||
u64 bpf_local_storage_map_mem_usage(const struct bpf_map *map)
|
||||
{
|
||||
struct bpf_local_storage_map *smap = (struct bpf_local_storage_map *)map;
|
||||
u64 usage = sizeof(*smap);
|
||||
|
||||
/* The dynamically callocated selems are not counted currently. */
|
||||
usage += sizeof(*smap->buckets) * (1ULL << smap->bucket_log);
|
||||
return usage;
|
||||
}
|
||||
|
||||
struct bpf_map *
|
||||
bpf_local_storage_map_alloc(union bpf_attr *attr,
|
||||
struct bpf_local_storage_cache *cache)
|
||||
|
|
|
@ -335,6 +335,7 @@ const struct bpf_map_ops task_storage_map_ops = {
|
|||
.map_update_elem = bpf_pid_task_storage_update_elem,
|
||||
.map_delete_elem = bpf_pid_task_storage_delete_elem,
|
||||
.map_check_btf = bpf_local_storage_map_check_btf,
|
||||
.map_mem_usage = bpf_local_storage_map_mem_usage,
|
||||
.map_btf_id = &bpf_local_storage_map_btf_id[0],
|
||||
.map_owner_storage_ptr = task_storage_ptr,
|
||||
};
|
||||
|
|
|
@ -324,6 +324,7 @@ const struct bpf_map_ops sk_storage_map_ops = {
|
|||
.map_local_storage_charge = bpf_sk_storage_charge,
|
||||
.map_local_storage_uncharge = bpf_sk_storage_uncharge,
|
||||
.map_owner_storage_ptr = bpf_sk_storage_ptr,
|
||||
.map_mem_usage = bpf_local_storage_map_mem_usage,
|
||||
};
|
||||
|
||||
const struct bpf_func_proto bpf_sk_storage_get_proto = {
|
||||
|
|
Загрузка…
Ссылка в новой задаче