synchronize_rcu_expedited()
, with
a hack for 2.6.32
(commit 019129d595caaa5bd0b41d128308da1be6a91869)
and real fix in 2.6.33.
The real fix is finally passing more than a few seconds of
rcutorture testing, so there is hope, but more likely for
2.6.34 than 2.6.33.
force_quiescent_state()
is running.
This would have little or no effect on performance, while
greatly simplifying race conditions.
CONFIG_RCU_CPU_STALL_DETECTOR
, thus
making stall detection unconditional.
The overhead of this option is negligible, it has proven
quite useful, and making it unconditional would reduce the
number of combinations of configuration parameters that must
be tested.
kfree()
's the specified memory block after
a grace period elapses. Lai Jiangshan and Manfred Spraul
are working on patches for this, see
Lai's and
Manfred's
patches.
force_quiescent_state()
is invoked.
Increasing this frequency can be useful when torture-testing
RCU.
But this can be done with a simple patch, so not sure that
this is really worth it.
call_rcu_blocking()
,
call_rcu_blocking_bh()
,
and call_rcu_blocking_sched()
that invoke synchronize_rcu()
(or the corresponding API)
if callbacks are backing up.
However, the base call_rcu()
family of functions
already have checks to accelerate grace periods, and these
primitives have extremely simple implementations, so they can wait
until there is a strong need.
ACCESS_ONCE()
primitives in TREE_PREEMPT_RCU's __rcu_read_lock()
and __rcu_read_unlock()
?
__call_rcu()
so that we can have deterministic RCU updates.
CONFIG_PREEMPT
builds of TREE_RCU.
In both cases, the first guess would be that
note_new_gpnum()
would be a good place for such
an optimization.
force_quiescent_state()
to send
IPIs by making rcu_check_callbacks()
invoke the
much cheaper set_need_resched()
.
PUBLISH_AND_STORE()
and a LOAD_AND_ACQUIRE()
primitive.
This should have the same readability benefits as did the
change from naked memory barriers to rcu_assign_pointer()
and rcu_dereference().
kernel/rcutree_plugin.h
really wants to
define forward-referenced static inline functions.
What is the best way to handle this?
#include
of
kernel/rcu_plugin.h
back up near the front
of kernel/rcutree.c
, bringing back the
ugly list of functions referenced by the plugins.
struct rcu_head
and group these structures by function in order to:
struct rcu_head
, and
Another approach is to maintain a separate queue that tracks
the functions to be invoked and the memory blocks to invoke them on,
as Mathieu Desnoyers
suggested. This means that the new defer_rcu()
primitive can now block, either when waiting for a grace period
to elapse or when allocating new memory. Alternatively, this
primitive could return an error if the callback could not
be enqueued immediately. Of course, the queue of callbacks
must be present, so that memory savings will depend on the
workload.
git://lttng.org/userspace-rcu.git
,
or, if you prefer tarballs,
here.
long
variables to unsigned long
.
First attempts to do this were quite ugly, so am happy to assume
that all machines that Linux runs on will be twos-complement
machines.