From: Arnd Bergmann The macro originally introduced in commit f6be98d19985 ("bpf, net: switch to dynamic registration") causes a warning in the new smc code because of the way it evaluates the arguments: In file included from include/linux/bpf_verifier.h:7, from net/smc/smc_hs_bpf.c:13: net/smc/smc_hs_bpf.c: In function 'bpf_smc_hs_ctrl_init': include/linux/bpf.h:2076:50: error: statement with no effect [-Werror=unused-value] 2076 | #define register_bpf_struct_ops(st_ops, type) ({ (void *)(st_ops); 0; }) | ^~~~~~~~~~~~~~~~ net/smc/smc_hs_bpf.c:139:16: note: in expansion of macro 'register_bpf_struct_ops' 139 | return register_bpf_struct_ops(&bpf_smc_hs_ctrl_ops, smc_hs_ctrl); | ^~~~~~~~~~~~~~~~~~~~~~~ Work around this using an inline function that takes the argument, the same way as the normal implementation. Since the second argument to register_bpf_struct_ops() is a type rather than an object, this still has to be a macro, but it can call a new inline helper internally like the normal one does. Fixes: 15f295f55656 ("net/smc: bpf: Introduce generic hook for handshake flow") Cc: Kui-Feng Lee Cc: Martin KaFai Lau Signed-off-by: Arnd Bergmann --- include/linux/bpf.h | 2 +- include/linux/btf.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 6498be4c44f8..eca6966d4f87 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2065,7 +2065,7 @@ int bpf_struct_ops_desc_init(struct bpf_struct_ops_desc *st_ops_desc, void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map); void bpf_struct_ops_desc_release(struct bpf_struct_ops_desc *st_ops_desc); #else -#define register_bpf_struct_ops(st_ops, type) ({ (void *)(st_ops); 0; }) +#define register_bpf_struct_ops(st_ops, type) __register_bpf_struct_ops(st_ops) static inline bool bpf_try_module_get(const void *data, struct module *owner) { return try_module_get(owner); diff --git a/include/linux/btf.h b/include/linux/btf.h index f06976ffb63f..799a75209536 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -535,6 +535,11 @@ int __register_bpf_struct_ops(struct bpf_struct_ops *st_ops); const struct bpf_struct_ops_desc *bpf_struct_ops_find_value(struct btf *btf, u32 value_id); const struct bpf_struct_ops_desc *bpf_struct_ops_find(struct btf *btf, u32 type_id); #else +struct bpf_struct_ops; +static inline int __register_bpf_struct_ops(struct bpf_struct_ops *st_ops) +{ + return 0; +} static inline const struct bpf_struct_ops_desc *bpf_struct_ops_find(struct btf *btf, u32 type_id) { return NULL; -- 2.39.5