All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@kernel.org>
To: Christoph Lameter <cl@gentwo.de>
Cc: rcu@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@fb.com, rostedt@goodmis.org,
	Pekka Enberg <penberg@kernel.org>,
	David Rientjes <rientjes@google.com>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Vlastimil Babka <vbabka@suse.cz>,
	Roman Gushchin <roman.gushchin@linux.dev>,
	Hyeonggon Yoo <42.hyeyoo@gmail.com>,
	linux-mm@kvack.org
Subject: Re: [PATCH rcu 5/8] slab: Explain why SLAB_DESTROY_BY_RCU reference before locking
Date: Fri, 21 Oct 2022 06:43:09 -0700	[thread overview]
Message-ID: <20221021134309.GG5600@paulmck-ThinkPad-P17-Gen-1> (raw)
In-Reply-To: <03d5730-9241-542d-76c6-728be4487c4@gentwo.de>

On Fri, Oct 21, 2022 at 09:44:23AM +0200, Christoph Lameter wrote:
> On Wed, 19 Oct 2022, Paul E. McKenney wrote:
> 
> > It is not obvious to the casual user why it is absolutely necessary to
> > acquire a reference to a SLAB_DESTROY_BY_RCU structure before acquiring
> > a lock in that structure.  Therefore, add a comment explaining this point.
> 
> Sorry but this is not correct and difficult to comprehend.
> 
> 1. You do not need a reference to a slab object after it was allocated.
>    Objects must be properly protected by rcu_locks.
> 
> 2. Locks are initialized once on slab allocation via a constructor (*not* on object allocation via kmem_cache_alloc)
> 
> 3. Modifying locks at allocation/free is not possible since references to
>    these objects may still persist after free and before alloc.
> 
> 4. The old term SLAB_DESTROY_BY_RCU is used here.

Thank you for looking this over, but Vlastimil beat you to it.  How does
the update below look?

							Thanx, Paul

------------------------------------------------------------------------

commit ff4c536e6b44e2e185e38c3653851f92e07139da
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Mon Sep 26 08:57:56 2022 -0700

    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: Vlastimil Babka <vbabka@suse.cz>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>
    Cc: <linux-mm@kvack.org>

diff --git a/include/linux/slab.h b/include/linux/slab.h
index 90877fcde70bd..487418c7ea8cd 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -76,6 +76,17 @@
  * rcu_read_lock before reading the address, then rcu_read_unlock after
  * 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.
  */
 /* Defer freeing slabs to RCU */

  reply	other threads:[~2022-10-21 13:43 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-19 22:46 [PATCH rcu 0/8] Miscellaneous fixes for v6.2 Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 1/8] rcu: Remove duplicate RCU exp QS report from rcu_report_dead() Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 2/8] rcu: Synchronize ->qsmaskinitnext in rcu_boost_kthread_setaffinity() Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 3/8] rcu: Remove unused 'cpu' in rcu_virt_note_context_switch() Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 4/8] rcu: Use READ_ONCE() for lockless read of rnp->qsmask Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 5/8] slab: Explain why SLAB_DESTROY_BY_RCU reference before locking Paul E. McKenney
2022-10-20  7:10   ` Vlastimil Babka
2022-10-20 16:31     ` Paul E. McKenney
2022-10-21  7:44   ` Christoph Lameter
2022-10-21 13:43     ` Paul E. McKenney [this message]
2022-10-21 13:50       ` Vlastimil Babka
2022-10-21 15:42         ` Paul E. McKenney
2022-10-21 15:50           ` Vlastimil Babka
2022-10-21 16:10             ` Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 6/8] rcu: Remove rcu_is_idle_cpu() Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 7/8] rcu-tasks: Make grace-period-age message human-readable Paul E. McKenney
2022-10-19 22:46 ` [PATCH rcu 8/8] rcu: Fix __this_cpu_read() lockdep warning in rcu_force_quiescent_state() Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221021134309.GG5600@paulmck-ThinkPad-P17-Gen-1 \
    --to=paulmck@kernel.org \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=cl@gentwo.de \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=penberg@kernel.org \
    --cc=rcu@vger.kernel.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=rostedt@goodmis.org \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.