Commit c072a388d59a1d48e36864d0e66f42d71745be1c
1 parent
394f4528c5
Exists in
master
and in
7 other branches
rcu: demote SRCU_SYNCHRONIZE_DELAY from kernel-parameter status
Because the adaptive synchronize_srcu_expedited() approach has worked very well in testing, remove the kernel parameter and replace it by a C-preprocessor macro. If someone finds problems with this approach, a more complex and aggressively adaptive approach might be required. Longer term, SRCU will be merged with the other RCU implementations, at which point synchronize_srcu_expedited() will be event driven, just as synchronize_sched_expedited() currently is. At that point, there will be no need for this adaptive approach. Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Showing 2 changed files with 13 additions and 17 deletions Side-by-side Diff
init/Kconfig
... | ... | @@ -497,21 +497,6 @@ |
497 | 497 | |
498 | 498 | Accept the default if unsure. |
499 | 499 | |
500 | -config SRCU_SYNCHRONIZE_DELAY | |
501 | - int "Microseconds to delay before waiting for readers" | |
502 | - range 0 20 | |
503 | - default 10 | |
504 | - help | |
505 | - This option controls how long SRCU delays before entering its | |
506 | - loop waiting on SRCU readers. The purpose of this loop is | |
507 | - to avoid the unconditional context-switch penalty that would | |
508 | - otherwise be incurred if there was an active SRCU reader, | |
509 | - in a manner similar to adaptive locking schemes. This should | |
510 | - be set to be a bit longer than the common-case SRCU read-side | |
511 | - critical-section overhead. | |
512 | - | |
513 | - Accept the default if unsure. | |
514 | - | |
515 | 500 | endmenu # "RCU Subsystem" |
516 | 501 | |
517 | 502 | config IKCONFIG |
kernel/srcu.c
... | ... | @@ -156,6 +156,16 @@ |
156 | 156 | EXPORT_SYMBOL_GPL(__srcu_read_unlock); |
157 | 157 | |
158 | 158 | /* |
159 | + * We use an adaptive strategy for synchronize_srcu() and especially for | |
160 | + * synchronize_srcu_expedited(). We spin for a fixed time period | |
161 | + * (defined below) to allow SRCU readers to exit their read-side critical | |
162 | + * sections. If there are still some readers after 10 microseconds, | |
163 | + * we repeatedly block for 1-millisecond time periods. This approach | |
164 | + * has done well in testing, so there is no need for a config parameter. | |
165 | + */ | |
166 | +#define SYNCHRONIZE_SRCU_READER_DELAY 10 | |
167 | + | |
168 | +/* | |
159 | 169 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). |
160 | 170 | */ |
161 | 171 | static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) |
162 | 172 | |
... | ... | @@ -207,11 +217,12 @@ |
207 | 217 | * will have finished executing. We initially give readers |
208 | 218 | * an arbitrarily chosen 10 microseconds to get out of their |
209 | 219 | * SRCU read-side critical sections, then loop waiting 1/HZ |
210 | - * seconds per iteration. | |
220 | + * seconds per iteration. The 10-microsecond value has done | |
221 | + * very well in testing. | |
211 | 222 | */ |
212 | 223 | |
213 | 224 | if (srcu_readers_active_idx(sp, idx)) |
214 | - udelay(CONFIG_SRCU_SYNCHRONIZE_DELAY); | |
225 | + udelay(SYNCHRONIZE_SRCU_READER_DELAY); | |
215 | 226 | while (srcu_readers_active_idx(sp, idx)) |
216 | 227 | schedule_timeout_interruptible(1); |
217 | 228 |