D.1.3.2 Initialization Implementation

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.

Figure: SRCU Initialization
\begin{figure}{ \scriptsize
\begin{verbatim}1 int init_srcu_struct(struct src...
...);
7 return (sp->per_cpu_ref ? 0 : -ENOMEM);
8 }\end{verbatim}
}\end{figure}

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.

Figure: SRCU Cleanup
\begin{figure}{ \scriptsize
\begin{verbatim}1 int srcu_readers_active_idx(str...
...p->per_cpu_ref);
28 sp->per_cpu_ref = NULL;
29 }\end{verbatim}
}\end{figure}

Paul E. McKenney 2011-12-16