Commit 8cbd0e38 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: Add Kconfig option for strict RCU grace periods



People running automated tests have asked for a way to make RCU minimize
grace-period duration in order to increase the probability of KASAN
detecting a pointer being improperly leaked from an RCU read-side critical
section, for example, like this:

	rcu_read_lock();
	p = rcu_dereference(gp);
	do_something_with(p); // OK
	rcu_read_unlock();
	do_something_else_with(p); // BUG!!!

The rcupdate.rcu_expedited boot parameter is a start in this direction,
given that it makes calls to synchronize_rcu() instead invoke the faster
(and more wasteful) synchronize_rcu_expedited().  However, this does
nothing to shorten RCU grace periods that are instead initiated by
call_rcu(), and RCU pointer-leak bugs can involve call_rcu() just as
surely as they can synchronize_rcu().

This commit therefore adds a RCU_STRICT_GRACE_PERIOD Kconfig option
that will be used to shorten normal (non-expedited) RCU grace periods.
This commit also dumps out a message when this option is in effect.
Later commits will actually shorten grace periods.

Reported-by Jann Horn <jannh@google.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 9123e3a7
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -114,4 +114,19 @@ config RCU_EQS_DEBUG
	  Say N here if you need ultimate kernel/user switch latencies
	  Say Y if you are unsure

config RCU_STRICT_GRACE_PERIOD
	bool "Provide debug RCU implementation with short grace periods"
	depends on DEBUG_KERNEL && RCU_EXPERT
	default n
	select PREEMPT_COUNT if PREEMPT=n
	help
	  Select this option to build an RCU variant that is strict about
	  grace periods, making them as short as it can.  This limits
	  scalability, destroys real-time response, degrades battery
	  lifetime and kills performance.  Don't try this on large
	  machines, as in systems with more than about 10 or 20 CPUs.
	  But in conjunction with tools like KASAN, it can be helpful
	  when looking for certain types of RCU usage bugs, for example,
	  too-short RCU read-side critical sections.

endmenu # "RCU Debugging"
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ static void __init rcu_bootup_announce_oddness(void)
		pr_info("\tRCU dyntick-idle grace-period acceleration is enabled.\n");
	if (IS_ENABLED(CONFIG_PROVE_RCU))
		pr_info("\tRCU lockdep checking is enabled.\n");
	if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
		pr_info("\tRCU strict (and thus non-scalable) grace periods enabled.\n");
	if (RCU_NUM_LVLS >= 4)
		pr_info("\tFour(or more)-level hierarchy is enabled.\n");
	if (RCU_FANOUT_LEAF != 16)