mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
slab: Explain why SLAB_TYPESAFE_BY_RCU reference before locking
It is not obvious to the casual user why it is absolutely necessary to acquire a reference to a SLAB_TYPESAFE_BY_RCU structure before acquiring a lock in that structure. Therefore, add a comment explaining this point. [ paulmck: Apply Vlastimil Babka feedback. ] Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Cc: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com> Cc: <linux-mm@kvack.org> Acked-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
@@ -76,6 +76,17 @@
|
|||||||
* rcu_read_lock before reading the address, then rcu_read_unlock after
|
* rcu_read_lock before reading the address, then rcu_read_unlock after
|
||||||
* taking the spinlock within the structure expected at that address.
|
* taking the spinlock within the structure expected at that address.
|
||||||
*
|
*
|
||||||
|
* Note that it is not possible to acquire a lock within a structure
|
||||||
|
* allocated with SLAB_TYPESAFE_BY_RCU without first acquiring a reference
|
||||||
|
* as described above. The reason is that SLAB_TYPESAFE_BY_RCU pages
|
||||||
|
* are not zeroed before being given to the slab, which means that any
|
||||||
|
* locks must be initialized after each and every kmem_struct_alloc().
|
||||||
|
* Alternatively, make the ctor passed to kmem_cache_create() initialize
|
||||||
|
* the locks at page-allocation time, as is done in __i915_request_ctor(),
|
||||||
|
* sighand_ctor(), and anon_vma_ctor(). Such a ctor permits readers
|
||||||
|
* to safely acquire those ctor-initialized locks under rcu_read_lock()
|
||||||
|
* protection.
|
||||||
|
*
|
||||||
* Note that SLAB_TYPESAFE_BY_RCU was originally named SLAB_DESTROY_BY_RCU.
|
* Note that SLAB_TYPESAFE_BY_RCU was originally named SLAB_DESTROY_BY_RCU.
|
||||||
*/
|
*/
|
||||||
/* Defer freeing slabs to RCU */
|
/* Defer freeing slabs to RCU */
|
||||||
|
|||||||
Reference in New Issue
Block a user