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

Commit ea73a5c6 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'for-mingo' of...

Merge branch 'for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu

 into core/rcu

Pull RCU updates from Paul E. McKenney:

- An optimization and a fix for RCU expedited grace periods, with
  the fix being from Boqun Feng.

- Miscellaneous fixes, including a lockdep-annotation fix from
  Boqun Feng.

- SRCU updates.

- Updates to rcutorture and associated scripting.

- Introduce grace-period sequence numbers to the RCU-bh, RCU-preempt,
  and RCU-sched flavors, replacing the old ->gpnum and ->completed
  pair of fields.  This change allows lockless code to obtain the
  complete grace-period state with a single READ_ONCE(), which is
  needed to maintain tolerable lock contention during the upcoming
  consolidation of the three RCU flavors.  Note that grace-period
  sequence numbers are already used by rcu_barrier(), expedited
  RCU grace periods, and SRCU, and are thus already heavily used
  and well-tested.  Joel Fernandes contributed a number of excellent
  fixes and improvements.

- Clean up some grace-period-reporting loose ends, including
  improving the handling of quiescent states from offline CPUs
  and fixing some false-positive WARN_ON_ONCE() invocations.
  (Strictly speaking, the WARN_ON_ONCE() invocations were quite
  correct, but their invariants were (harmlessly) violated by the
  earlier sloppy handling of quiescent states from offline CPUs.)
  In addition, improve grace-period forward-progress guarantees so
  as to allow removal of fail-safe checks that required otherwise
  needless lock acquisitions.  Finally, add more diagnostics to
  help debug the upcoming consolidation of the RCU-bh, RCU-preempt,
  and RCU-sched flavors.

- Additional miscellaneous fixes, including those contributed by
  Byungchul Park, Mauro Carvalho Chehab, Joe Perches, Joel Fernandes,
  Steven Rostedt, Andrea Parri, and Neil Brown.

- Additional torture-test changes, including several contributed by
  Arnd Bergmann and Joel Fernandes.

Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 9d3cce1e 18952651
Loading
Loading
Loading
Loading
+63 −55
Original line number Original line Diff line number Diff line
@@ -380,31 +380,26 @@ and therefore need no protection.
as follows:
as follows:


<pre>
<pre>
  1   unsigned long gpnum;
  1   unsigned long gp_seq;
  2   unsigned long completed;
</pre>
</pre>


<p>RCU grace periods are numbered, and
<p>RCU grace periods are numbered, and
the <tt>-&gt;gpnum</tt> field contains the number of the grace
the <tt>-&gt;gp_seq</tt> field contains the current grace-period
period that started most recently.
sequence number.
The <tt>-&gt;completed</tt> field contains the number of the
The bottom two bits are the state of the current grace period,
grace period that completed most recently.
which can be zero for not yet started or one for in progress.
If the two fields are equal, the RCU grace period that most recently
In other words, if the bottom two bits of <tt>-&gt;gp_seq</tt> are
started has already completed, and therefore the corresponding
zero, the corresponding flavor of RCU is idle.
flavor of RCU is idle.
Any other value in the bottom two bits indicates that something is broken.
If <tt>-&gt;gpnum</tt> is one greater than <tt>-&gt;completed</tt>,
This field is protected by the root <tt>rcu_node</tt> structure's
then <tt>-&gt;gpnum</tt> gives the number of the current RCU
grace period, which has not yet completed.
Any other combination of values indicates that something is broken.
These two fields are protected by the root <tt>rcu_node</tt>'s
<tt>-&gt;lock</tt> field.
<tt>-&gt;lock</tt> field.


</p><p>There are <tt>-&gt;gpnum</tt> and <tt>-&gt;completed</tt> fields
</p><p>There are <tt>-&gt;gp_seq</tt> fields
in the <tt>rcu_node</tt> and <tt>rcu_data</tt> structures
in the <tt>rcu_node</tt> and <tt>rcu_data</tt> structures
as well.
as well.
The fields in the <tt>rcu_state</tt> structure represent the
The fields in the <tt>rcu_state</tt> structure represent the
most current values, and those of the other structures are compared
most current value, and those of the other structures are compared
in order to detect the start of a new grace period in a distributed
in order to detect the beginnings and ends of grace periods in a distributed
fashion.
fashion.
The values flow from <tt>rcu_state</tt> to <tt>rcu_node</tt>
The values flow from <tt>rcu_state</tt> to <tt>rcu_node</tt>
(down the tree from the root to the leaves) to <tt>rcu_data</tt>.
(down the tree from the root to the leaves) to <tt>rcu_data</tt>.
@@ -512,27 +507,47 @@ than to be heisenbugged out of existence.
as follows:
as follows:


<pre>
<pre>
  1   unsigned long gpnum;
  1   unsigned long gp_seq;
  2   unsigned long completed;
  2   unsigned long gp_seq_needed;
</pre>
</pre>


<p>These fields are the counterparts of the fields of the same name in
<p>The <tt>rcu_node</tt> structures' <tt>-&gt;gp_seq</tt> fields are
the <tt>rcu_state</tt> structure.
the counterparts of the field of the same name in the <tt>rcu_state</tt>
They each may lag up to one behind their <tt>rcu_state</tt>
structure.
counterparts.
They each may lag up to one step behind their <tt>rcu_state</tt>
If a given <tt>rcu_node</tt> structure's <tt>-&gt;gpnum</tt> and
counterpart.
<tt>-&gt;complete</tt> fields are equal, then this <tt>rcu_node</tt>
If the bottom two bits of a given <tt>rcu_node</tt> structure's
<tt>-&gt;gp_seq</tt> field is zero, then this <tt>rcu_node</tt>
structure believes that RCU is idle.
structure believes that RCU is idle.
Otherwise, as with the <tt>rcu_state</tt> structure,
</p><p>The <tt>&gt;gp_seq</tt> field of each <tt>rcu_node</tt>
the <tt>-&gt;gpnum</tt> field will be one greater than the
structure is updated at the beginning and the end
<tt>-&gt;complete</tt> fields, with <tt>-&gt;gpnum</tt>
of each grace period.
indicating which grace period this <tt>rcu_node</tt> believes

is still being waited for.
<p>The <tt>-&gt;gp_seq_needed</tt> fields record the
furthest-in-the-future grace period request seen by the corresponding
<tt>rcu_node</tt> structure.  The request is considered fulfilled when
the value of the <tt>-&gt;gp_seq</tt> field equals or exceeds that of
the <tt>-&gt;gp_seq_needed</tt> field.


</p><p>The <tt>&gt;gpnum</tt> field of each <tt>rcu_node</tt>
<table>
structure is updated at the beginning
<tr><th>&nbsp;</th></tr>
of each grace period, and the <tt>-&gt;completed</tt> fields are
<tr><th align="left">Quick Quiz:</th></tr>
updated at the end of each grace period.
<tr><td>
	Suppose that this <tt>rcu_node</tt> structure doesn't see
	a request for a very long time.
	Won't wrapping of the <tt>-&gt;gp_seq</tt> field cause
	problems?
</td></tr>
<tr><th align="left">Answer:</th></tr>
<tr><td bgcolor="#ffffff"><font color="ffffff">
	No, because if the <tt>-&gt;gp_seq_needed</tt> field lags behind the
	<tt>-&gt;gp_seq</tt> field, the <tt>-&gt;gp_seq_needed</tt> field
	will be updated at the end of the grace period.
	Modulo-arithmetic comparisons therefore will always get the
	correct answer, even with wrapping.
</font></td></tr>
<tr><td>&nbsp;</td></tr>
</table>


<h5>Quiescent-State Tracking</h5>
<h5>Quiescent-State Tracking</h5>


@@ -626,9 +641,8 @@ normal and expedited grace periods, respectively.
	</ol>
	</ol>


	<p><font color="ffffff">So the locking is absolutely required in
	<p><font color="ffffff">So the locking is absolutely required in
	order to coordinate
	order to coordinate clearing of the bits with updating of the
	clearing of the bits with the grace-period numbers in
	grace-period sequence number in <tt>-&gt;gp_seq</tt>.
	<tt>-&gt;gpnum</tt> and <tt>-&gt;completed</tt>.
</font></td></tr>
</font></td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td></tr>
</table>
</table>
@@ -1038,15 +1052,15 @@ out any <tt>rcu_data</tt> structure for which this flag is not set.
as follows:
as follows:


<pre>
<pre>
  1   unsigned long completed;
  1   unsigned long gp_seq;
  2   unsigned long gpnum;
  2   unsigned long gp_seq_needed;
  3   bool cpu_no_qs;
  3   bool cpu_no_qs;
  4   bool core_needs_qs;
  4   bool core_needs_qs;
  5   bool gpwrap;
  5   bool gpwrap;
  6   unsigned long rcu_qs_ctr_snap;
  6   unsigned long rcu_qs_ctr_snap;
</pre>
</pre>


<p>The <tt>completed</tt> and <tt>gpnum</tt>
<p>The <tt>-&gt;gp_seq</tt> and <tt>-&gt;gp_seq_needed</tt>
fields are the counterparts of the fields of the same name
fields are the counterparts of the fields of the same name
in the <tt>rcu_state</tt> and <tt>rcu_node</tt> structures.
in the <tt>rcu_state</tt> and <tt>rcu_node</tt> structures.
They may each lag up to one behind their <tt>rcu_node</tt>
They may each lag up to one behind their <tt>rcu_node</tt>
@@ -1054,15 +1068,9 @@ counterparts, but in <tt>CONFIG_NO_HZ_IDLE</tt> and
<tt>CONFIG_NO_HZ_FULL</tt> kernels can lag
<tt>CONFIG_NO_HZ_FULL</tt> kernels can lag
arbitrarily far behind for CPUs in dyntick-idle mode (but these counters
arbitrarily far behind for CPUs in dyntick-idle mode (but these counters
will catch up upon exit from dyntick-idle mode).
will catch up upon exit from dyntick-idle mode).
If a given <tt>rcu_data</tt> structure's <tt>-&gt;gpnum</tt> and
If the lower two bits of a given <tt>rcu_data</tt> structure's
<tt>-&gt;complete</tt> fields are equal, then this <tt>rcu_data</tt>
<tt>-&gt;gp_seq</tt> are zero, then this <tt>rcu_data</tt>
structure believes that RCU is idle.
structure believes that RCU is idle.
Otherwise, as with the <tt>rcu_state</tt> and <tt>rcu_node</tt>
structure,
the <tt>-&gt;gpnum</tt> field will be one greater than the
<tt>-&gt;complete</tt> fields, with <tt>-&gt;gpnum</tt>
indicating which grace period this <tt>rcu_data</tt> believes
is still being waited for.


<table>
<table>
<tr><th>&nbsp;</th></tr>
<tr><th>&nbsp;</th></tr>
@@ -1070,13 +1078,13 @@ is still being waited for.
<tr><td>
<tr><td>
	All this replication of the grace period numbers can only cause
	All this replication of the grace period numbers can only cause
	massive confusion.
	massive confusion.
	Why not just keep a global pair of counters and be done with it???
	Why not just keep a global sequence number and be done with it???
</td></tr>
</td></tr>
<tr><th align="left">Answer:</th></tr>
<tr><th align="left">Answer:</th></tr>
<tr><td bgcolor="#ffffff"><font color="ffffff">
<tr><td bgcolor="#ffffff"><font color="ffffff">
	Because if there was only a single global pair of grace-period
	Because if there was only a single global sequence
	numbers, there would need to be a single global lock to allow
	numbers, there would need to be a single global lock to allow
	safely accessing and updating them.
	safely accessing and updating it.
	And if we are not going to have a single global lock, we need
	And if we are not going to have a single global lock, we need
	to carefully manage the numbers on a per-node basis.
	to carefully manage the numbers on a per-node basis.
	Recall from the answer to a previous Quick Quiz that the consequences
	Recall from the answer to a previous Quick Quiz that the consequences
@@ -1091,8 +1099,8 @@ CPU has not yet passed through a quiescent state,
while the <tt>-&gt;core_needs_qs</tt> flag indicates that the
while the <tt>-&gt;core_needs_qs</tt> flag indicates that the
RCU core needs a quiescent state from the corresponding CPU.
RCU core needs a quiescent state from the corresponding CPU.
The <tt>-&gt;gpwrap</tt> field indicates that the corresponding
The <tt>-&gt;gpwrap</tt> field indicates that the corresponding
CPU has remained idle for so long that the <tt>completed</tt>
CPU has remained idle for so long that the
and <tt>gpnum</tt> counters are in danger of overflow, which
<tt>gp_seq</tt> counter is in danger of overflow, which
will cause the CPU to disregard the values of its counters on
will cause the CPU to disregard the values of its counters on
its next exit from idle.
its next exit from idle.
Finally, the <tt>rcu_qs_ctr_snap</tt> field is used to detect
Finally, the <tt>rcu_qs_ctr_snap</tt> field is used to detect
@@ -1130,10 +1138,10 @@ The CPU advances the callbacks in its <tt>rcu_data</tt> structure
whenever it notices that another RCU grace period has completed.
whenever it notices that another RCU grace period has completed.
The CPU detects the completion of an RCU grace period by noticing
The CPU detects the completion of an RCU grace period by noticing
that the value of its <tt>rcu_data</tt> structure's
that the value of its <tt>rcu_data</tt> structure's
<tt>-&gt;completed</tt> field differs from that of its leaf
<tt>-&gt;gp_seq</tt> field differs from that of its leaf
<tt>rcu_node</tt> structure.
<tt>rcu_node</tt> structure.
Recall that each <tt>rcu_node</tt> structure's
Recall that each <tt>rcu_node</tt> structure's
<tt>-&gt;completed</tt> field is updated at the end of each
<tt>-&gt;gp_seq</tt> field is updated at the beginnings and ends of each
grace period.
grace period.


<p>
<p>
+10 −12
Original line number Original line Diff line number Diff line
@@ -357,7 +357,7 @@ parts, starting in this section with the various phases of
grace-period initialization.
grace-period initialization.


<p>The first ordering-related grace-period initialization action is to
<p>The first ordering-related grace-period initialization action is to
increment the <tt>rcu_state</tt> structure's <tt>-&gt;gpnum</tt>
advance the <tt>rcu_state</tt> structure's <tt>-&gt;gp_seq</tt>
grace-period-number counter, as shown below:
grace-period-number counter, as shown below:


</p><p><img src="TreeRCU-gp-init-1.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
</p><p><img src="TreeRCU-gp-init-1.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
@@ -388,7 +388,7 @@ its last CPU and if the next <tt>rcu_node</tt> structure has no online CPUs).


<p>The final <tt>rcu_gp_init()</tt> pass through the <tt>rcu_node</tt>
<p>The final <tt>rcu_gp_init()</tt> pass through the <tt>rcu_node</tt>
tree traverses breadth-first, setting each <tt>rcu_node</tt> structure's
tree traverses breadth-first, setting each <tt>rcu_node</tt> structure's
<tt>-&gt;gpnum</tt> field to the newly incremented value from the
<tt>-&gt;gp_seq</tt> field to the newly advanced value from the
<tt>rcu_state</tt> structure, as shown in the following diagram.
<tt>rcu_state</tt> structure, as shown in the following diagram.


</p><p><img src="TreeRCU-gp-init-3.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
</p><p><img src="TreeRCU-gp-init-3.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
@@ -398,9 +398,9 @@ tree traverses breadth-first, setting each <tt>rcu_node</tt> structure's
to notice that a new grace period has started, as described in the next
to notice that a new grace period has started, as described in the next
section.
section.
But because the grace-period kthread started the grace period at the
But because the grace-period kthread started the grace period at the
root (with the increment of the <tt>rcu_state</tt> structure's
root (with the advancing of the <tt>rcu_state</tt> structure's
<tt>-&gt;gpnum</tt> field) before setting each leaf <tt>rcu_node</tt>
<tt>-&gt;gp_seq</tt> field) before setting each leaf <tt>rcu_node</tt>
structure's <tt>-&gt;gpnum</tt> field, each CPU's observation of
structure's <tt>-&gt;gp_seq</tt> field, each CPU's observation of
the start of the grace period will happen after the actual start
the start of the grace period will happen after the actual start
of the grace period.
of the grace period.


@@ -466,7 +466,7 @@ section that the grace period must wait on.
<tr><td>
<tr><td>
	But a RCU read-side critical section might have started
	But a RCU read-side critical section might have started
	after the beginning of the grace period
	after the beginning of the grace period
	(the <tt>-&gt;gpnum++</tt> from earlier), so why should
	(the advancing of <tt>-&gt;gp_seq</tt> from earlier), so why should
	the grace period wait on such a critical section?
	the grace period wait on such a critical section?
</td></tr>
</td></tr>
<tr><th align="left">Answer:</th></tr>
<tr><th align="left">Answer:</th></tr>
@@ -609,10 +609,8 @@ states outstanding from other CPUs.
<h4><a name="Grace-Period Cleanup">Grace-Period Cleanup</a></h4>
<h4><a name="Grace-Period Cleanup">Grace-Period Cleanup</a></h4>


<p>Grace-period cleanup first scans the <tt>rcu_node</tt> tree
<p>Grace-period cleanup first scans the <tt>rcu_node</tt> tree
breadth-first setting all the <tt>-&gt;completed</tt> fields equal
breadth-first advancing all the <tt>-&gt;gp_seq</tt> fields, then it
to the number of the newly completed grace period, then it sets
advances the <tt>rcu_state</tt> structure's <tt>-&gt;gp_seq</tt> field.
the <tt>rcu_state</tt> structure's <tt>-&gt;completed</tt> field,
again to the number of the newly completed grace period.
The ordering effects are shown below:
The ordering effects are shown below:


</p><p><img src="TreeRCU-gp-cleanup.svg" alt="TreeRCU-gp-cleanup.svg" width="75%">
</p><p><img src="TreeRCU-gp-cleanup.svg" alt="TreeRCU-gp-cleanup.svg" width="75%">
@@ -634,7 +632,7 @@ grace-period cleanup is complete, the next grace period can begin.
	CPU has reported its quiescent state, but it may be some
	CPU has reported its quiescent state, but it may be some
	milliseconds before RCU becomes aware of this.
	milliseconds before RCU becomes aware of this.
	The latest reasonable candidate is once the <tt>rcu_state</tt>
	The latest reasonable candidate is once the <tt>rcu_state</tt>
	structure's <tt>-&gt;completed</tt> field has been updated,
	structure's <tt>-&gt;gp_seq</tt> field has been updated,
	but it is quite possible that some CPUs have already completed
	but it is quite possible that some CPUs have already completed
	phase two of their updates by that time.
	phase two of their updates by that time.
	In short, if you are going to work with RCU, you need to
	In short, if you are going to work with RCU, you need to
@@ -647,7 +645,7 @@ grace-period cleanup is complete, the next grace period can begin.
<h4><a name="Callback Invocation">Callback Invocation</a></h4>
<h4><a name="Callback Invocation">Callback Invocation</a></h4>


<p>Once a given CPU's leaf <tt>rcu_node</tt> structure's
<p>Once a given CPU's leaf <tt>rcu_node</tt> structure's
<tt>-&gt;completed</tt> field has been updated, that CPU can begin
<tt>-&gt;gp_seq</tt> field has been updated, that CPU can begin
invoking its RCU callbacks that were waiting for this grace period
invoking its RCU callbacks that were waiting for this grace period
to end.
to end.
These callbacks are identified by <tt>rcu_advance_cbs()</tt>,
These callbacks are identified by <tt>rcu_advance_cbs()</tt>,
+65 −58
Original line number Original line Diff line number Diff line
@@ -384,11 +384,11 @@
     inkscape:window-height="1144"
     inkscape:window-height="1144"
     id="namedview208"
     id="namedview208"
     showgrid="true"
     showgrid="true"
     inkscape:zoom="0.70710678"
     inkscape:zoom="0.78716603"
     inkscape:cx="617.89017"
     inkscape:cx="513.06403"
     inkscape:cy="542.52419"
     inkscape:cy="623.1214"
     inkscape:window-x="86"
     inkscape:window-x="102"
     inkscape:window-y="28"
     inkscape:window-y="38"
     inkscape:window-maximized="0"
     inkscape:window-maximized="0"
     inkscape:current-layer="g3188-3"
     inkscape:current-layer="g3188-3"
     fit-margin-top="5"
     fit-margin-top="5"
@@ -417,13 +417,15 @@
     id="g3188">
     id="g3188">
    <text
    <text
       xml:space="preserve"
       xml:space="preserve"
       x="3199.1516"
       x="3145.9592"
       y="13255.592"
       y="13255.592"
       font-style="normal"
       font-style="normal"
       font-weight="bold"
       font-weight="bold"
       font-size="192"
       font-size="192"
       id="text202"
       id="text202"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3143">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
    <g
    <g
       id="g3107"
       id="g3107"
       transform="translate(947.90548,11584.029)">
       transform="translate(947.90548,11584.029)">
@@ -502,13 +504,15 @@
    </g>
    </g>
    <text
    <text
       xml:space="preserve"
       xml:space="preserve"
       x="5324.5371"
       x="5264.4731"
       y="15414.598"
       y="15428.84"
       font-style="normal"
       font-style="normal"
       font-weight="bold"
       font-weight="bold"
       font-size="192"
       font-size="192"
       id="text202-753"
       id="text202-36-7"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3166-5">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
  </g>
  </g>
  <g
  <g
     style="fill:none;stroke-width:0.025in"
     style="fill:none;stroke-width:0.025in"
@@ -547,15 +551,6 @@
       sodipodi:linespacing="125%"><tspan
       sodipodi:linespacing="125%"><tspan
         style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
         style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
         id="tspan3104-6-5-6-0">Leaf</tspan></text>
         id="tspan3104-6-5-6-0">Leaf</tspan></text>
    <text
       xml:space="preserve"
       x="7479.5796"
       y="17699.943"
       font-style="normal"
       font-weight="bold"
       font-size="192"
       id="text202-9"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
    <path
    <path
       sodipodi:nodetypes="cc"
       sodipodi:nodetypes="cc"
       inkscape:connector-curvature="0"
       inkscape:connector-curvature="0"
@@ -566,15 +561,6 @@
       style="fill:none;stroke-width:0.025in"
       style="fill:none;stroke-width:0.025in"
       transform="translate(-737.93887,7732.6672)"
       transform="translate(-737.93887,7732.6672)"
       id="g3188-3">
       id="g3188-3">
      <text
         xml:space="preserve"
         x="3225.7478"
         y="13175.802"
         font-style="normal"
         font-weight="bold"
         font-size="192"
         id="text202-60"
         style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">rsp-&gt;completed =</text>
      <g
      <g
         id="g3107-62"
         id="g3107-62"
         transform="translate(947.90548,11584.029)">
         transform="translate(947.90548,11584.029)">
@@ -607,15 +593,6 @@
         sodipodi:linespacing="125%"><tspan
         sodipodi:linespacing="125%"><tspan
           style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
           style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
           id="tspan3104-6-5-7">Root</tspan></text>
           id="tspan3104-6-5-7">Root</tspan></text>
      <text
         xml:space="preserve"
         x="3225.7478"
         y="13390.038"
         font-style="normal"
         font-weight="bold"
         font-size="192"
         id="text202-60-3"
         style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">       rnp-&gt;completed</text>
      <flowRoot
      <flowRoot
         xml:space="preserve"
         xml:space="preserve"
         id="flowRoot3356"
         id="flowRoot3356"
@@ -627,7 +604,18 @@
             height="63.63961"
             height="63.63961"
             x="332.34018"
             x="332.34018"
             y="681.87292" /></flowRegion><flowPara
             y="681.87292" /></flowRegion><flowPara
           id="flowPara3362" /></flowRoot>    </g>
           id="flowPara3362" /></flowRoot>      <text
         xml:space="preserve"
         x="3156.6121"
         y="13317.754"
         font-style="normal"
         font-weight="bold"
         font-size="192"
         id="text202-36-6"
         style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
           style="font-size:172.87567139px"
           id="tspan3166-0">rcu_seq_end(&amp;rsp-&gt;gp_seq)</tspan></text>
    </g>
    <g
    <g
       style="fill:none;stroke-width:0.025in"
       style="fill:none;stroke-width:0.025in"
       transform="translate(-858.40227,7769.0342)"
       transform="translate(-858.40227,7769.0342)"
@@ -859,6 +847,17 @@
       id="path3414-8-3-6-6"
       id="path3414-8-3-6-6"
       inkscape:connector-curvature="0"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="cc" />
       sodipodi:nodetypes="cc" />
    <text
       xml:space="preserve"
       x="7418.769"
       y="17646.104"
       font-style="normal"
       font-weight="bold"
       font-size="192"
       id="text202-36-70"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3166-93">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
  </g>
  </g>
  <g
  <g
     transform="translate(-1642.5377,-11611.245)"
     transform="translate(-1642.5377,-11611.245)"
@@ -887,13 +886,15 @@
    </g>
    </g>
    <text
    <text
       xml:space="preserve"
       xml:space="preserve"
       x="5327.3057"
       x="5274.1133"
       y="15428.84"
       y="15428.84"
       font-style="normal"
       font-style="normal"
       font-weight="bold"
       font-weight="bold"
       font-size="192"
       font-size="192"
       id="text202-36"
       id="text202-36"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3166">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
  </g>
  </g>
  <g
  <g
     transform="translate(-151.71746,-11647.612)"
     transform="translate(-151.71746,-11647.612)"
@@ -972,13 +973,15 @@
         id="tspan3104-6-5-6-0-92">Leaf</tspan></text>
         id="tspan3104-6-5-6-0-92">Leaf</tspan></text>
    <text
    <text
       xml:space="preserve"
       xml:space="preserve"
       x="7486.4907"
       x="7408.5918"
       y="17670.119"
       y="17619.504"
       font-style="normal"
       font-style="normal"
       font-weight="bold"
       font-weight="bold"
       font-size="192"
       font-size="192"
       id="text202-6"
       id="text202-36-2"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3166-9">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
  </g>
  </g>
  <g
  <g
     transform="translate(-6817.1997,-11647.612)"
     transform="translate(-6817.1997,-11647.612)"
@@ -1019,13 +1022,15 @@
         id="tspan3104-6-5-6-0-1">Leaf</tspan></text>
         id="tspan3104-6-5-6-0-1">Leaf</tspan></text>
    <text
    <text
       xml:space="preserve"
       xml:space="preserve"
       x="7474.1382"
       x="7416.8003"
       y="17688.926"
       y="17619.504"
       font-style="normal"
       font-style="normal"
       font-weight="bold"
       font-weight="bold"
       font-size="192"
       font-size="192"
       id="text202-5"
       id="text202-36-3"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3166-56">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
  </g>
  </g>
  <path
  <path
     style="fill:none;stroke:#000000;stroke-width:13.29812908px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
     style="fill:none;stroke:#000000;stroke-width:13.29812908px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
@@ -1059,15 +1064,6 @@
     id="path3414-8-3-6"
     id="path3414-8-3-6"
     inkscape:connector-curvature="0"
     inkscape:connector-curvature="0"
     sodipodi:nodetypes="cc" />
     sodipodi:nodetypes="cc" />
  <text
     xml:space="preserve"
     x="7318.9653"
     y="6031.6353"
     font-style="normal"
     font-weight="bold"
     font-size="192"
     id="text202-2"
     style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">-&gt;completed = -&gt;gpnum</text>
  <g
  <g
     style="fill:none;stroke-width:0.025in"
     style="fill:none;stroke-width:0.025in"
     id="g4504-3-9"
     id="g4504-3-9"
@@ -1123,4 +1119,15 @@
     id="path3134-9-0-3-5"
     id="path3134-9-0-3-5"
     d="m 6875.6003,15833.906 1595.7755,0"
     d="m 6875.6003,15833.906 1595.7755,0"
     style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send-36)" />
     style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send-36)" />
  <text
     xml:space="preserve"
     x="7275.2612"
     y="5971.8916"
     font-style="normal"
     font-weight="bold"
     font-size="192"
     id="text202-36-1"
     style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"><tspan
       style="font-size:172.87567139px"
       id="tspan3166-2">rcu_seq_end(&amp;rnp-&gt;gp_seq)</tspan></text>
</svg>
</svg>
+9 −7
Original line number Original line Diff line number Diff line
@@ -272,13 +272,13 @@
     inkscape:window-height="1144"
     inkscape:window-height="1144"
     id="namedview208"
     id="namedview208"
     showgrid="true"
     showgrid="true"
     inkscape:zoom="0.70710678"
     inkscape:zoom="2.6330492"
     inkscape:cx="617.89019"
     inkscape:cx="524.82797"
     inkscape:cy="636.57143"
     inkscape:cy="519.31194"
     inkscape:window-x="697"
     inkscape:window-x="79"
     inkscape:window-y="28"
     inkscape:window-y="28"
     inkscape:window-maximized="0"
     inkscape:window-maximized="0"
     inkscape:current-layer="svg2"
     inkscape:current-layer="g3188"
     fit-margin-top="5"
     fit-margin-top="5"
     fit-margin-right="5"
     fit-margin-right="5"
     fit-margin-left="5"
     fit-margin-left="5"
@@ -305,13 +305,15 @@
     id="g3188">
     id="g3188">
    <text
    <text
       xml:space="preserve"
       xml:space="preserve"
       x="3305.5364"
       x="3119.363"
       y="13255.592"
       y="13255.592"
       font-style="normal"
       font-style="normal"
       font-weight="bold"
       font-weight="bold"
       font-size="192"
       font-size="192"
       id="text202"
       id="text202"
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">rsp-&gt;gpnum++</text>
       style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier"><tspan
         style="font-size:172.87567139px"
         id="tspan3071">rcu_seq_start(rsp-&gt;gp_seq)</tspan></text>
    <g
    <g
       id="g3107"
       id="g3107"
       transform="translate(947.90548,11584.029)">
       transform="translate(947.90548,11584.029)">
+30 −26

File changed.

Preview size limit exceeded, changes collapsed.

Loading