Re: [PATCH v2] Documentation: Add refcount analogy to What is RCU

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Oct 29, 2021 at 05:16:45PM +0900, Akira Yokosawa wrote:
> Hi Paul, Hello Neil,
> 
> Please find inline comments below on minor issues I noticed while
> testing "make htmldocs" on this patch.
> 
> Thu, Thu, 28 Oct 2021 12:03:36 -0700
> Paul E. McKenney wrote:
> > I could not resist the urge to do a small amount of wordsmithing, so
> > please check below in case I messed something up.
> > 
> > 							Thanx, Paul
> > 
> > -------------------------------------------------------------------------
> > 
> > commit 25ce7d081265ce4d29cb2a537a932813df1b7697
> > Author: NeilBrown <neilb@xxxxxxx>
> > Date:   Tue Oct 26 15:53:38 2021 +1100
> > 
> >     Documentation: Add refcount analogy to What is RCU
> >     
> >     The reader-writer-lock analogy is a useful way to think about RCU, but
> >     it is not always applicable.  It is useful to have other analogies to
> >     work with, and particularly to emphasise that no single analogy is
>                                      emphasize

This is the proper Commonwealth spelling, last I knew, Neil lived in
Australia, and we do have a fair number of them, so I will let this
one be.  But yes, in perfbook, I would correct it.  ;-)

> >     perfect.
> >     
> >     This patch add a "RCU as reference count" to the "what is RCU" document.
> >     
> >     See https://lwn.net/Articles/872559/
> >     
> >     Signed-off-by: NeilBrown <neilb@xxxxxxx>
> >     Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx>
> > 
> > diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst
> > index 17e95ab2a201..798f92c050cc 100644
> > --- a/Documentation/RCU/whatisRCU.rst
> > +++ b/Documentation/RCU/whatisRCU.rst
> > @@ -39,9 +39,11 @@ different paths, as follows:
> >  
> >  :ref:`6.	ANALOGY WITH READER-WRITER LOCKING <6_whatisRCU>`
> >  
> > -:ref:`7.	FULL LIST OF RCU APIs <7_whatisRCU>`
> > +:ref:`7.	ANALOGY WITH REFERENCE COUNTING <7_whatisRCU>'                                                             `  (:ref:`...`)

I confess .rst confusion.  I am not sure what this string is supposed
to replace nor what the "..." is supposed to be.  So could you please
send me a fixup patch for this change so that I can squash that patch
into Neil's original?

> > -:ref:`8.	ANSWERS TO QUICK QUIZZES <8_whatisRCU>`
> > +:ref:`8.	FULL LIST OF RCU APIs <8_whatisRCU>`
> > +
> > +:ref:`9.	ANSWERS TO QUICK QUIZZES <9_whatisRCU>`
> >  
> >  People who prefer starting with a conceptual overview should focus on
> >  Section 1, though most readers will profit by reading this section at
> > @@ -677,7 +679,7 @@ Quick Quiz #1:
> >  		occur when using this algorithm in a real-world Linux
> >  		kernel?  How could this deadlock be avoided?
> >  
> > -:ref:`Answers to Quick Quiz <8_whatisRCU>`
> > +:ref:`Answers to Quick Quiz <9_whatisRCU>`
> >  
> >  5B.  "TOY" EXAMPLE #2: CLASSIC RCU
> >  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > @@ -732,7 +734,7 @@ Quick Quiz #2:
> >  		Give an example where Classic RCU's read-side
> >  		overhead is **negative**.
> >  
> > -:ref:`Answers to Quick Quiz <8_whatisRCU>`
> > +:ref:`Answers to Quick Quiz <9_whatisRCU>`
> >  
> >  .. _quiz_3:
> >  
> > @@ -741,7 +743,7 @@ Quick Quiz #3:
> >  		critical section, what the heck do you do in
> >  		CONFIG_PREEMPT_RT, where normal spinlocks can block???
> >  
> > -:ref:`Answers to Quick Quiz <8_whatisRCU>`
> > +:ref:`Answers to Quick Quiz <9_whatisRCU>`
> >  
> >  .. _6_whatisRCU:
> >  
> > @@ -872,7 +874,78 @@ be used in place of synchronize_rcu().
> >  
> >  .. _7_whatisRCU:
> >  
> > -7.  FULL LIST OF RCU APIs
> > +7.  ANALOGY WITH REFERENCE COUNTING
> > +-----------------------------------
> > +
> > +The reader-writer analogy (illustrated by the previous section) is not
> > +always the best way to think about using RCU.  Another helpful analogy
> > +considers RCU a effective reference count on everything which is protected
>                  an

Good catch, fixed!

> > +by RCU.
> > +
> > +A reference count typically does not prevent the referenced object's
> > +values from changing, but does prevent changes to type - particularly the
>                                                           -- (convention in this doc)

Fixed this as well, thank you!

> > +gross change of type that happens when that object's memory is freed and
> > +re-allocated for some other purpose.  Once a type-safe reference to the
> > +object is obtained, some other mechanism is needed to ensure consistent
> > +access to the data in the object.  This could involve taking a spinlock,
> > +but with RCU the typical approach is to perform reads with SMP-aware
> > +operations such as smp_load_acquire(), to perform updates with atomic
> > +read-modify-write operations, and to provide the necessary ordering.
> > +RCU provides a number of support functions that embed the required
> > +operations and ordering, such as the list_for_each_entry_rcu() macro
> > +used in the previous section.
> > +
> > +A more focused view of the reference counting behaviour is that,
>                                                  behavior (American spelling)

This one I did change.  Neil owns the commit log, but yes, the file
should be consistent.

> > +between rcu_read_lock() and rcu_read_unlock(), any reference taken with
> > +rcu_dereference() on a pointer marked as ``__rcu`` can be treated as
> > +though a reference-count on that object has been temporarily increased.
> > +This prevents the object from changing type.  Exactly what this means
> > +will depend on normal expectations of objects of that type, but it
> > +typically includes that spinlocks can still be safely locked, normal
> > +reference counters can be safely manipulated, and ``__rcu`` pointers
> > +can be safely dereferenced.
> > +
> > +Some operations that one might expect to see on an object for
> > +which an RCU reference is held include:
> 
> Without an empty line here, "make htmldocs" will complain. 

Fixed, thank you!

> > + - Copying out data that is guaranteed to be stable by the object's type.
> > + - Using kref_get_unless_zero() or similar to get a longer-term
> > +   reference.  This may fail of course.
> > + - Acquiring a spinlock in the object, and checking if the object still
> > +   is the expected object and if so, manipulating it freely.
> > +
> > +The understanding that RCU provides a reference that only prevents a
> > +change of type is particularly visible with objects allocated from a
> > +slab cache marked ``SLAB_TYPESAFE_BY_RCU``.  RCU operations may yield a
> > +reference to an object from such a cache that has been concurrently
> > +freed and the memory reallocated to a completely different object,
> > +though of the same type.  In this case RCU doesn't even protect the
> > +identity of the object from changing, only its type.  So the object
> > +found may not be the one expected, but it will be one where it is safe
> > +to take a reference or spinlock and then confirm that the identity
> > +matches the expectations.
> > +
> > +With traditional reference counting - such as that implemented by the
>                                        --

Fixed " - " globally, other than the bulleted list, thank you!

> > +kref library in Linux - there is typically code that runs when the last
>                          --
> 
> > +reference to an object is dropped.  With kref, this is the function
> > +passed to kref_put().  When RCU is being used such finalization code
>                           When RCU is being used, such finalization code

This one could be argued, but the extra comma helps.

> > +must not be run until all ``__rcu`` pointers referencing the object have
> > +been updated, and then a grace period has passed.  Every remaining
> > +globally visible pointer to the object must be considered to be a
> > +potential counted reference, and the finalization code it typically run
>                                                           is (???)

Looks that way to me, fixed.

> > +using call_rcu() only after all those pointers have been changed.
> > +
> > +To see how to choose between there two analogies - of RCU as a
>                                 these               --

Good eyes, fixed!

> > +reader-writer lock and RCU as a reference counting system - it is useful
>                                                              --
> 
> > +to reflect on the scale of the thing being protected.  The reader-writer
> > +lock analogy looks at larger multi-part objects such as a linked list
> > +and shows how RCU can facilitate concurrency while elements are added
> > +to, and removed from, the list.  The reference-count analogy looks at
> > +the individual objects and looks at how they can be accessed safely
> > +within whatever whole they are a part of.
> 
> Hope this helps.
> 
> With these comments addressed, please feel free to add:
> 
> Reviewed-by: Akira Yokosawa <akiyks@xxxxxxxxx>

I have a squash commit pending.  Please send me a patch for the
table-of-contents ":ref:" change.  And it looks like I should make
another try at getting "make htmldocs" running again...

							Thanx, Paul

>        Thanks, Akira
> 
> > +
> > +.. _8_whatisRCU:
> > +
> > +8.  FULL LIST OF RCU APIs
> >  -------------------------
> >  
> >  The RCU APIs are documented in docbook-format header comments in the
> > @@ -1035,9 +1108,9 @@ g.	Otherwise, use RCU.
> >  Of course, this all assumes that you have determined that RCU is in fact
> >  the right tool for your job.
> >  
> > -.. _8_whatisRCU:
> > +.. _9_whatisRCU:
> >  
> > -8.  ANSWERS TO QUICK QUIZZES
> > +9.  ANSWERS TO QUICK QUIZZES
> >  ----------------------------
> >  
> >  Quick Quiz #1:
> 



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux