[PATCH] srcu-3: RCU variant permitting read-side blocking
authorPaul E. McKenney <paulmck@us.ibm.com>
Wed, 4 Oct 2006 09:17:02 +0000 (02:17 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 4 Oct 2006 14:55:30 +0000 (07:55 -0700)
commit621934ee7ed5b073c7fd638b347e632c53572761
tree5722f9cda22c099ad60545f963410dcbc762ee65
parent95d77884c77beed676036d2f74d10b470a483c63
[PATCH] srcu-3: RCU variant permitting read-side blocking

Updated patch adding a variant of RCU that permits sleeping in read-side
critical sections.  SRCU is as follows:

o Each use of SRCU creates its own srcu_struct, and each
srcu_struct has its own set of grace periods.  This is
critical, as it prevents one subsystem with a blocking
reader from holding up SRCU grace periods for other
subsystems.

o The SRCU primitives (srcu_read_lock(), srcu_read_unlock(),
and synchronize_srcu()) all take a pointer to a srcu_struct.

o The SRCU primitives must be called from process context.

o srcu_read_lock() returns an int that must be passed to
the matching srcu_read_unlock().  Realtime RCU avoids the
need for this by storing the state in the task struct,
but SRCU needs to allow a given code path to pass through
multiple SRCU domains -- storing state in the task struct
would therefore require either arbitrary space in the
task struct or arbitrary limits on SRCU nesting.  So I
kicked the state-storage problem up to the caller.

Of course, it is not permitted to call synchronize_srcu()
while in an SRCU read-side critical section.

o There is no call_srcu().  It would not be hard to implement
one, but it seems like too easy a way to OOM the system.
(Hey, we have enough trouble with call_rcu(), which does
-not- permit readers to sleep!!!)  So, if you want it,
please tell me why...

[josht@us.ibm.com: sparse notation]
Signed-off-by: Paul E. McKenney <paulmck@us.ibm.com>
Signed-off-by: Josh Triplett <josh@freedesktop.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Documentation/RCU/checklist.txt
Documentation/RCU/rcu.txt
Documentation/RCU/whatisRCU.txt
include/linux/srcu.h [new file with mode: 0644]
kernel/Makefile
kernel/srcu.c [new file with mode: 0644]