Loading Documentation/RCU/Design/Requirements/Requirements.html +35 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
Documentation/RCU/Design/Requirements/Requirements.html +35 −0 Original line number Diff line number Diff line Loading @@ -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 Loading