SRCU's initialization function, init_srcu_struct(), is shown in
Figure .
This function simply initializes the fields in the
struct srcu_struct, returning zero if initialization succeeds
or -ENOMEM otherwise.
SRCU's cleanup functions are shown in
Figure .
The main cleanup function, cleanup_srcu_struct() is shown
on lines 19-29 of this figure, however, it immediately invokes
srcu_readers_active(), shown on lines 13-17 of this figure,
to verify that there are no readers currently using this
struct srcu_struct.
The srcu_readers_active() function simply returns the sum of srcu_readers_active_idx() on both possible indexes, while srcu_readers_active_idx(), as shown on lines 1-11, sums up the per-CPU counters corresponding to the specified index, returning the result.
If the value returned from srcu_readers_active() is non-zero, then cleanup_srcu_struct() issues a warning on line 24 and simply returns on lines 25 and 26, declining to destroy a struct srcu_struct that is still in use. Such a warning always indicates a bug, and given that the bug has been reported, it is better to allow the system to continue with a modest memory leak than to introduce possible memory corruption.
Otherwise, cleanup_srcu_struct() frees the array of per-CPU counters and NULLs the pointer on lines 27 and 28.
Paul E. McKenney 2011-12-16