mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Lai Jiangshan <jiangshanlai@gmail.com>
To: Kunwu Chan <kunwu.chan@gmail.com>
Cc: paulmck@kernel.org, corbet@lwn.net, mingo@redhat.com,
	 frederic@kernel.org, neeraj.upadhyay@kernel.org,
	josh@joshtriplett.org,  urezki@gmail.com, dave@stgolabs.net,
	lianux.mm@gmail.com,  stern@rowland.harvard.edu,
	parri.andrea@gmail.com, will@kernel.org, peterz@infradead.org,
	 boqun@kernel.org, npiggin@gmail.com, dhowells@redhat.com,
	j.alglave@ucl.ac.uk,  luc.maranget@inria.fr, akiyks@gmail.com,
	dlustig@nvidia.com, joelagnelf@nvidia.com,
	 skhan@linuxfoundation.org, rdunlap@infradead.org,
	longman@redhat.com, rostedt@goodmis.org,
	 mathieu.desnoyers@efficios.com, qiang.zhang@linux.dev,
	brads@mainlining.org,  linux-kernel@vger.kernel.org,
	linux-arch@vger.kernel.org, lkmm@lists.linux.dev,
	 linux-doc@vger.kernel.org, rcu@vger.kernel.org,
	linux-kselftest@vger.kernel.org
Subject: Re: [PATCH RFC v3 08/15] locking/lockdep: use hazptr to wait for dynamic key lookups
Date: Tue, 13 Oct 2026 15:40:36 +0800	[thread overview]
Message-ID: <as3aMmPdCHCXW6Ci@U-YXDQC754-96.local> (raw)
In-Reply-To: <20261005171529.1378809-9-kunwu.chan@gmail.com>

On Tue, Oct 06, 2026 at 01:15:22AM +0800, Kunwu Chan wrote:
> lockdep_unregister_key() waits for is_dynamic_key() callers with
> synchronize_rcu_expedited(), which requires system-wide coordination.
> Make is_dynamic_key() protect the hash bucket with a hazard pointer
> and use hazptr_synchronize() to wait for traversals of that bucket.
> 
> The hash bucket returned by keyhashentry() has a stable address, so
> it can be used as the hazptr synchronization target.  Keep the key
> hashlist lifetime RCU-based with hlist_del_rcu() and call_rcu().
> 
> Protect the traversal with the hazptr scoped_guard() added earlier
> in this series.
> 
> This adapts the lockdep use case from Boqun Feng's shazptr series
> to the current hazptr API.
> 
> Link: https://lore.kernel.org/lkml/20250625031101.12555-1-boqun.feng@gmail.com/

Hello,

I think this is a misuse of hazard pointers.

The bucket has a permanent, static address; its lifetime does not
need hazard-pointer protection. Instead, this patch combines a
hazard pointer with that address to construct a read-side/synchronize
mechanism in the same category as RCU. However, this construction
lacks the generation distinction needed to separate pre-existing
readers from subsequent readers.

The object being removed is the key, but the synchronization target
is the bucket. Unlinking the key does not prevent new lookups from
acquiring the same bucket address, including lookups for unrelated
keys that hash to that bucket.

This breaks the forward-progress argument used by the underlying
hazptr implementation: after removing an object from publication,
there should not be a continuing stream of new readers acquiring
that same object. Here, the bucket is never unpublished.

For example, let B be the bucket containing key K:

  Updater                    Reader                 Scan kthread
  -------                    ------                 ------------
  Unlink K from B
  hazptr_synchronize(B)
                             Acquire B
                                                    Observe B;
                                                    retain waiter
                             Release B
                             Acquire B again
                                                    Observe B;
                                                    retain waiter
                             Release B
                             ...                    ...

Every reader critical section can finish, and the scan kthread
can keep running, while the updater waits indefinitely. Readers
that could have observed K may already have completed; later
lookups alone can keep the waiter pending.

RCU does not need the reader population to become empty. Its
generation (grace-period) machinery allows pre-existing readers to
drain without letting a continuous stream of subsequent readers
indefinitely extend that wait. This address-based construction has
no equivalent distinction.

So this is not merely protecting a different object with hazptr:
it is using hazptr as a different synchronization primitive without
providing the corresponding progress guarantee.

I think we should retain the RCU wait here. If the intention is to
implement bucket-scoped read-side synchronization, that needs an
explicit protocol to distinguish the readers being drained from
new arrivals; a permanent bucket address is not sufficient.

Sorry for the lengthy reply, which was written with the help of an AI
agent. I noticed this issue when this use case was first proposed, but
I struggled to articulate my concerns clearly back then. Well, now we
have AI. :)

Thanks
Lai

> Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
> ---
>  kernel/locking/lockdep.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> index c56a7f91d72e..d1ce5ace7fbf 100644
> --- a/kernel/locking/lockdep.c
> +++ b/kernel/locking/lockdep.c
> @@ -58,6 +58,7 @@
>  #include <linux/context_tracking.h>
>  #include <linux/console.h>
>  #include <linux/kasan.h>
> +#include <linux/hazptr.h>
>  
>  #include <asm/sections.h>
>  
> @@ -1280,14 +1281,19 @@ static bool is_dynamic_key(const struct lock_class_key *key)
>  
>  	hash_head = keyhashentry(key);
>  
> -	rcu_read_lock();
> -	hlist_for_each_entry_rcu(k, hash_head, hash_entry) {
> -		if (k == key) {
> -			found = true;
> -			break;
> +	{
> +		struct hazptr_ctx ctx;
> +		void *bucket = hash_head;
> +
> +		scoped_guard(hazptr, &ctx, &bucket) {
> +			hlist_for_each_entry_rcu(k, hash_head, hash_entry, 1) {
> +				if (k == key) {
> +					found = true;
> +					break;
> +				}
> +			}
>  		}
>  	}
> -	rcu_read_unlock();
>  
>  	return found;
>  }
> @@ -6683,11 +6689,10 @@ void lockdep_unregister_key(struct lock_class_key *key)
>  	 *
>  	 * Some operations like __qdisc_destroy() will call this in a debug
>  	 * kernel, and the network traffic is disabled while waiting, hence
> -	 * the delay of the wait matters in debugging cases. Currently use a
> -	 * synchronize_rcu_expedited() to speed up the wait at the cost of
> -	 * system IPIs. TODO: Replace RCU with hazptr for this.
> +	 * the delay of the wait matters in debugging cases. Replace the
> +	 * expedited RCU wait with hazptr_synchronize().
>  	 */
> -	synchronize_rcu_expedited();
> +	hazptr_synchronize(keyhashentry(key));
>  }
>  EXPORT_SYMBOL_GPL(lockdep_unregister_key);
>  
> -- 
> 2.43.0
> 

  reply	other threads:[~2026-10-13  7:40 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-05 17:15 [PATCH RFC v3 00/15] hazptr: batch synchronize operations through a shared scan Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 01/15] hazptr: add shared scan kthread Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 02/15] hazptr: use Bloom filter for shared scan waiters Kunwu Chan
2026-10-06  5:51   ` Mathieu Desnoyers
2026-10-06  6:13     ` KunWu Chan
2026-10-10  3:06     ` KunWu Chan
2026-10-05 17:15 ` [PATCH RFC v3 03/15] hazptr: scan all per-CPU slots before overflow lists Kunwu Chan
2026-10-13 11:26   ` Kai Ma
2026-10-05 17:15 ` [PATCH RFC v3 04/15] hazptr: add scoped_guard() support Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 05/15] hazptr: add debug option to force the acquire slow path Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 06/15] hazptr: elide redundant first drain pass Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 07/15] Documentation/litmus-tests: add hazptr wildcard-flip escape test Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 08/15] locking/lockdep: use hazptr to wait for dynamic key lookups Kunwu Chan
2026-10-13  7:40   ` Lai Jiangshan [this message]
2026-10-13 12:48     ` Boqun Feng
2026-10-13 13:04       ` Mathieu Desnoyers
2026-10-13 14:05         ` Lai Jiangshan
2026-10-13 18:55         ` Paul E. McKenney
2026-10-05 17:15 ` [PATCH RFC v3 09/15] rcuscale: add hazptr scale type Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 10/15] hazptr: fix kernel-doc of hazptr_release() Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 11/15] Documentation/litmus-tests: add hazptr acquire-before-scan test Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 12/15] hazptrtorture: add slowpath and lockdep scenarios Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 13/15] hazptrtorture: add READERS4 and READERS0 torture configs Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 14/15] hazptrtorture: add 128- and 256-CPU configs Kunwu Chan
2026-10-05 17:15 ` [PATCH RFC v3 15/15] selftests/rcutorture: add hazptr torture test script Kunwu Chan

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=as3aMmPdCHCXW6Ci@U-YXDQC754-96.local \
    --to=jiangshanlai@gmail.com \
    --cc=akiyks@gmail.com \
    --cc=boqun@kernel.org \
    --cc=brads@mainlining.org \
    --cc=corbet@lwn.net \
    --cc=dave@stgolabs.net \
    --cc=dhowells@redhat.com \
    --cc=dlustig@nvidia.com \
    --cc=frederic@kernel.org \
    --cc=j.alglave@ucl.ac.uk \
    --cc=joelagnelf@nvidia.com \
    --cc=josh@joshtriplett.org \
    --cc=kunwu.chan@gmail.com \
    --cc=lianux.mm@gmail.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=lkmm@lists.linux.dev \
    --cc=longman@redhat.com \
    --cc=luc.maranget@inria.fr \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@redhat.com \
    --cc=neeraj.upadhyay@kernel.org \
    --cc=npiggin@gmail.com \
    --cc=parri.andrea@gmail.com \
    --cc=paulmck@kernel.org \
    --cc=peterz@infradead.org \
    --cc=qiang.zhang@linux.dev \
    --cc=rcu@vger.kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=skhan@linuxfoundation.org \
    --cc=stern@rowland.harvard.edu \
    --cc=urezki@gmail.com \
    --cc=will@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®