rcu: Add a TINY_PREEMPT_RCU
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 29 Jun 2010 23:49:16 +0000 (16:49 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 20 Aug 2010 15:55:00 +0000 (08:55 -0700)
Implement a small-memory-footprint uniprocessor-only implementation of
preemptible RCU.  This implementation uses but a single blocked-tasks
list rather than the combinatorial number used per leaf rcu_node by
TREE_PREEMPT_RCU, which reduces memory consumption and greatly simplifies
processing.  This version also takes advantage of uniprocessor execution
to accelerate grace periods in the case where there are no readers.

The general design is otherwise broadly similar to that of TREE_PREEMPT_RCU.

This implementation is a step towards having RCU implementation driven
off of the SMP and PREEMPT kernel configuration variables, which can
happen once this implementation has accumulated sufficient experience.

Removed ACCESS_ONCE() from __rcu_read_unlock() and added barrier() as
suggested by Steve Rostedt in order to avoid the compiler-reordering
issue noted by Mathieu Desnoyers (http://lkml.org/lkml/2010/8/16/183).

As can be seen below, CONFIG_TINY_PREEMPT_RCU represents almost 5Kbyte
savings compared to CONFIG_TREE_PREEMPT_RCU.  Of course, for non-real-time
workloads, CONFIG_TINY_RCU is even better.

CONFIG_TREE_PREEMPT_RCU

   text    data     bss     dec    filename
     13       0       0      13    kernel/rcupdate.o
   6170     825      28    7023    kernel/rcutree.o
   ----
   7026    Total

CONFIG_TINY_PREEMPT_RCU

   text    data     bss     dec    filename
     13       0       0      13    kernel/rcupdate.o
   2081      81       8    2170    kernel/rcutiny.o
   ----
   2183    Total

CONFIG_TINY_RCU (non-preemptible)

   text    data     bss     dec    filename
     13       0       0      13    kernel/rcupdate.o
    719      25       0     744    kernel/rcutiny.o
    ---
    757    Total

Requested-by: Loïc Minier <loic.minier@canonical.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
include/linux/hardirq.h
include/linux/init_task.h
include/linux/rcupdate.h
include/linux/rcutiny.h
include/linux/rcutree.h
include/linux/sched.h
init/Kconfig
kernel/Makefile
kernel/rcutiny.c
kernel/rcutiny_plugin.h

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc init/Kconfig
Simple merge
diff --cc kernel/Makefile
Simple merge
Simple merge
Simple merge