Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c79dac75 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

documentation: Add RCU_NONIDLE() restrictions to requirements

parent db4855b5
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -2391,6 +2391,41 @@ and <tt>RCU_NONIDLE()</tt> on the other while inspecting
idle-loop code.
Steven Rostedt supplied <tt>_rcuidle</tt> event tracing,
which is used quite heavily in the idle loop.
However, there are some restrictions on the code placed within
<tt>RCU_NONIDLE()</tt>:

<ol>
<li>	Blocking is prohibited.
	In practice, this is not a serious restriction given that idle
	tasks are prohibited from blocking to begin with.
<li>	Although nesting <tt>RCU_NONIDLE()</tt> is permited, they cannot
	nest indefinitely deeply.
	However, given that they can be nested on the order of a million
	deep, even on 32-bit systems, this should not be a serious
	restriction.
	This nesting limit would probably be reached long after the
	compiler OOMed or the stack overflowed.
<li>	Any code path that enters <tt>RCU_NONIDLE()</tt> must sequence
	out of that same <tt>RCU_NONIDLE()</tt>.
	For example, the following is grossly illegal:

	<blockquote>
	<pre>
 1     RCU_NONIDLE({
 2       do_something();
 3       goto bad_idea;  /* BUG!!! */
 4       do_something_else();});
 5   bad_idea:
	</pre>
	</blockquote>

	<p>
	It is just as illegal to transfer control into the middle of
	<tt>RCU_NONIDLE()</tt>'s argument.
	Yes, in theory, you could transfer in as long as you also
	transferred out, but in practice you could also expect to get sharply
	worded review comments.
</ol>

<p>
It is similarly socially unacceptable to interrupt an