This will be used in the rcu scale test, to ensure that fly-by call_rcu()s do no cause call_rcu_lazy() CBs to be flushed to the rdp ->cblist. Signed-off-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx> --- kernel/rcu/rcu.h | 2 ++ kernel/rcu/tree.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h index 4916077119f3..71c0f45e70c3 100644 --- a/kernel/rcu/rcu.h +++ b/kernel/rcu/rcu.h @@ -472,6 +472,7 @@ void do_trace_rcu_torture_read(const char *rcutorturename, unsigned long c_old, unsigned long c); void rcu_gp_set_torture_wait(int duration); +void rcu_force_call_rcu_to_lazy(bool force); #else static inline void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags, unsigned long *gp_seq) @@ -490,6 +491,7 @@ void do_trace_rcu_torture_read(const char *rcutorturename, do { } while (0) #endif static inline void rcu_gp_set_torture_wait(int duration) { } +static inline void rcu_force_call_rcu_to_lazy(bool force) { } #endif #if IS_ENABLED(CONFIG_RCU_TORTURE_TEST) || IS_MODULE(CONFIG_RCU_TORTURE_TEST) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index d2e3d6e176d2..711679d10cbb 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3171,9 +3171,18 @@ void call_rcu_lazy(struct rcu_head *head, rcu_callback_t func) EXPORT_SYMBOL_GPL(call_rcu_lazy); #endif +static bool force_call_rcu_to_lazy; + +void rcu_force_call_rcu_to_lazy(bool force) +{ + if (IS_ENABLED(CONFIG_RCU_SCALE_TEST)) + WRITE_ONCE(force_call_rcu_to_lazy, force); +} +EXPORT_SYMBOL_GPL(rcu_force_call_rcu_to_lazy); + void call_rcu(struct rcu_head *head, rcu_callback_t func) { - return __call_rcu_common(head, func, false); + return __call_rcu_common(head, func, force_call_rcu_to_lazy); } EXPORT_SYMBOL_GPL(call_rcu); -- 2.37.0.rc0.104.g0611611a94-goog