To allow struct_ops implementors to access the bpf_map during reg() and unreg(), return bpf_map from bpf_struct_ops_get() instead and let callers check the error. Additionally, expose bpf_struct_ops_get() and bpf_struct_ops_put() so that kernel modules can use them. Signed-off-by: Amery Hung --- include/linux/bpf.h | 4 ++-- kernel/bpf/bpf_struct_ops.c | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index f9cd2164ed23..5bc08a77df7c 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1948,7 +1948,7 @@ struct bpf_struct_ops_common_value { __register_bpf_struct_ops(st_ops); \ }) #define BPF_MODULE_OWNER ((void *)((0xeB9FUL << 2) + POISON_POINTER_DELTA)) -bool bpf_struct_ops_get(const void *kdata); +struct bpf_map *bpf_struct_ops_get(const void *kdata); void bpf_struct_ops_put(const void *kdata); int bpf_struct_ops_supported(const struct bpf_struct_ops *st_ops, u32 moff); int bpf_struct_ops_map_sys_lookup_elem(struct bpf_map *map, void *key, @@ -1963,7 +1963,7 @@ void bpf_struct_ops_image_free(void *image); static inline bool bpf_try_module_get(const void *data, struct module *owner) { if (owner == BPF_MODULE_OWNER) - return bpf_struct_ops_get(data); + return !IS_ERR(bpf_struct_ops_get(data)); else return try_module_get(owner); } diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c index 687a3e9c76f5..7b9bb6a211f0 100644 --- a/kernel/bpf/bpf_struct_ops.c +++ b/kernel/bpf/bpf_struct_ops.c @@ -1150,7 +1150,7 @@ const struct bpf_map_ops bpf_struct_ops_map_ops = { /* "const void *" because some subsystem is * passing a const (e.g. const struct tcp_congestion_ops *) */ -bool bpf_struct_ops_get(const void *kdata) +struct bpf_map *bpf_struct_ops_get(const void *kdata) { struct bpf_struct_ops_value *kvalue; struct bpf_struct_ops_map *st_map; @@ -1159,9 +1159,9 @@ bool bpf_struct_ops_get(const void *kdata) kvalue = container_of(kdata, struct bpf_struct_ops_value, data); st_map = container_of(kvalue, struct bpf_struct_ops_map, kvalue); - map = __bpf_map_inc_not_zero(&st_map->map, false); - return !IS_ERR(map); + return __bpf_map_inc_not_zero(&st_map->map, false); } +EXPORT_SYMBOL_GPL(bpf_struct_ops_get); void bpf_struct_ops_put(const void *kdata) { @@ -1173,6 +1173,7 @@ void bpf_struct_ops_put(const void *kdata) bpf_map_put(&st_map->map); } +EXPORT_SYMBOL_GPL(bpf_struct_ops_put); static bool bpf_struct_ops_valid_to_reg(struct bpf_map *map) { -- 2.47.3