On Mon, Feb 02, 2026 at 10:55:01AM +0100, Arnd Bergmann wrote: > From: Arnd Bergmann <[email protected]> > > There are some configurations in which lockdep_assert_rcu_helper() ends up > not being inlined, for some reason. This leads to a link failure because > now the caller tries to pass a nonexistant __ctx_lock_RCU structure: > > ld: lib/test_context-analysis.o: in function `test_rcu_assert_variants': > test_context-analysis.c:(.text+0x275c): undefined reference to `RCU' > ld: test_context-analysis.c:(.text+0x276c): undefined reference to `RCU_BH' > ld: test_context-analysis.c:(.text+0x2774): undefined reference to `RCU_SCHED' > > I saw this in one out of many 32-bit arm builds using gcc-15.2, but > it probably happens in others as well. > > Mark this function as __always_inline to fix the build. > > Fixes: fe00f6e84621 ("rcu: Support Clang's context analysis") > Signed-off-by: Arnd Bergmann <[email protected]>
Reviewed-by: Paul E. McKenney <[email protected]> > --- > include/linux/rcupdate.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h > index ea1e979b290e..7729fef249e1 100644 > --- a/include/linux/rcupdate.h > +++ b/include/linux/rcupdate.h > @@ -406,7 +406,7 @@ static inline void rcu_preempt_sleep_check(void) { } > > // See RCU_LOCKDEP_WARN() for an explanation of the double call to > // debug_lockdep_rcu_enabled(). > -static inline bool lockdep_assert_rcu_helper(bool c, const struct > __ctx_lock_RCU *ctx) > +static __always_inline bool lockdep_assert_rcu_helper(bool c, const struct > __ctx_lock_RCU *ctx) > __assumes_shared_ctx_lock(RCU) __assumes_shared_ctx_lock(ctx) > { > return debug_lockdep_rcu_enabled() && > -- > 2.39.5 >

