From: Nathan Chancellor <[email protected]> Date: Sat, 25 Oct 2025 21:53:20 +0100
> When building drivers/net/ethernet/intel/idpf/xsk.c for ARCH=arm with > CONFIG_CFI=y using a version of LLVM prior to 22.0.0, there is a > BUILD_BUG_ON failure: > > $ cat arch/arm/configs/repro.config > CONFIG_BPF_SYSCALL=y > CONFIG_CFI=y > CONFIG_IDPF=y > CONFIG_XDP_SOCKETS=y > > $ make -skj"$(nproc)" ARCH=arm LLVM=1 clean defconfig repro.config > drivers/net/ethernet/intel/idpf/xsk.o > In file included from drivers/net/ethernet/intel/idpf/xsk.c:4: > include/net/libeth/xsk.h:205:2: error: call to '__compiletime_assert_728' > declared with 'error' attribute: BUILD_BUG_ON failed: > !__builtin_constant_p(tmo == libeth_xsktmo) > 205 | BUILD_BUG_ON(!__builtin_constant_p(tmo == libeth_xsktmo)); > | ^ I've been wondering why I keep getting these reports for some time already as my CI bot's never been able to trigger this. So seems like it's CFI... > ... > > libeth_xdp_tx_xmit_bulk() indirectly calls libeth_xsk_xmit_fill_buf() > but these functions are marked as __always_inline so that the compiler > can turn these indirect calls into direct ones and see that the tmo > parameter to __libeth_xsk_xmit_fill_buf_md() is ultimately libeth_xsktmo > from idpf_xsk_xmit(). > > Unfortunately, the generic kCFI pass in LLVM expands the kCFI bundles > from the indirect calls in libeth_xdp_tx_xmit_bulk() in such a way that > later optimizations cannot turn these calls into direct ones, making the > BUILD_BUG_ON fail because it cannot be proved at compile time that tmo > is libeth_xsktmo. > > Disable the generic kCFI pass for libeth_xdp_tx_xmit_bulk() to ensure > these indirect calls can always be turned into direct calls to avoid > this error. Hmmm, For this patch: Acked-by: Alexander Lobakin <[email protected]> However, The XSk metadata infra in the kernel relies on that when we call xsk_tx_metadata_request(), we pass a static const struct with our callbacks and then the compiler makes all these calls direct. This is not limited to libeth (although I realize that it triggered this build failure due to the way how I pass these callbacks), every driver which implements XSk Tx metadata and calls xsk_tx_metadata_request() relies on that these calls will be direct, otherwise there'll be such performance penalty that is unacceptable for XSk speeds. Maybe xsk_tx_metadata_request() should be __nocfi as well? Or all the callers of it? > > Closes: https://github.com/ClangBuiltLinux/linux/issues/2124 > Fixes: 9705d6552f58 ("idpf: implement Rx path for AF_XDP") > Signed-off-by: Nathan Chancellor <[email protected]> > --- > include/net/libeth/xdp.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/net/libeth/xdp.h b/include/net/libeth/xdp.h > index bc3507edd589..898723ab62e8 100644 > --- a/include/net/libeth/xdp.h > +++ b/include/net/libeth/xdp.h > @@ -513,7 +513,7 @@ struct libeth_xdp_tx_desc { > * can't fail, but can send less frames if there's no enough free descriptors > * available. The actual free space is returned by @prep from the driver. > */ > -static __always_inline u32 > +static __always_inline __nocfi_generic u32 > libeth_xdp_tx_xmit_bulk(const struct libeth_xdp_tx_frame *bulk, void *xdpsq, > u32 n, bool unroll, u64 priv, > u32 (*prep)(void *xdpsq, struct libeth_xdpsq *sq), Thanks, Olek
