From: Waiman Long <llong@redhat.com>
To: paulmck@kernel.org, Waiman Long <llong@redhat.com>
Cc: Boqun Feng <boqun.feng@gmail.com>,
Eric Dumazet <edumazet@google.com>,
Peter Zijlstra <peterz@infradead.org>,
Breno Leitao <leitao@debian.org>, Ingo Molnar <mingo@redhat.com>,
Will Deacon <will@kernel.org>,
aeh@meta.com, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, jhs@mojatatu.com, kernel-team@meta.com,
Erik Lundgren <elundgren@meta.com>
Subject: Re: [PATCH] lockdep: Speed up lockdep_unregister_key() with expedited RCU synchronization
Date: Mon, 31 Mar 2025 14:57:20 -0400 [thread overview]
Message-ID: <69592dc7-5c21-485b-b00e-1c34ffb4cee8@redhat.com> (raw)
In-Reply-To: <35039448-d8e8-4a7d-b59b-758d81330d4b@paulmck-laptop>
On 3/31/25 2:33 PM, Paul E. McKenney wrote:
> On Mon, Mar 31, 2025 at 01:33:22PM -0400, Waiman Long wrote:
>> On 3/31/25 1:26 PM, Boqun Feng wrote:
>>> On Wed, Mar 26, 2025 at 11:39:49AM -0400, Waiman Long wrote:
>>> [...]
>>>>>> Anyway, that may work. The only problem that I see is the issue of nesting
>>>>>> of an interrupt context on top of a task context. It is possible that the
>>>>>> first use of a raw_spinlock may happen in an interrupt context. If the
>>>>>> interrupt happens when the task has set the hazard pointer and iterating the
>>>>>> hash list, the value of the hazard pointer may be overwritten. Alternatively
>>>>>> we could have multiple slots for the hazard pointer, but that will make the
>>>>>> code more complicated. Or we could disable interrupt before setting the
>>>>>> hazard pointer.
>>>>> Or we can use lockdep_recursion:
>>>>>
>>>>> preempt_disable();
>>>>> lockdep_recursion_inc();
>>>>> barrier();
>>>>>
>>>>> WRITE_ONCE(*hazptr, ...);
>>>>>
>>>>> , it should prevent the re-entrant of lockdep in irq.
>>>> That will probably work. Or we can disable irq. I am fine with both.
>>> Disabling irq may not work in this case, because an NMI can also happen
>>> and call register_lock_class().
>> Right, disabling irq doesn't work with NMI. So incrementing the recursion
>> count is likely the way to go and I think it will work even in the NMI case.
>>
>>> I'm experimenting a new idea here, it might be better (for general
>>> cases), and this has the similar spirit that we could move the
>>> protection scope of a hazard pointer from a key to a hash_list: we can
>>> introduce a wildcard address, and whenever we do a synchronize_hazptr(),
>>> if the hazptr slot equal to wildcard, we treat as it matches to any ptr,
>>> hence synchronize_hazptr() will still wait until it's zero'd. Not only
>>> this could help in the nesting case, it can also be used if the users
>>> want to protect multiple things with this simple hazard pointer
>>> implementation.
>> I think it is a good idea to add a wildcard for the general use case.
>> Setting the hazptr to the list head will be enough for this particular case.
> Careful! If we enable use of wildcards outside of the special case
> of synchronize_hazptr(), we give up the small-memory-footprint advantages
> of hazard pointers. You end up having to wait on all hazard-pointer
> readers, which was exactly why RCU was troublesome here. ;-)
If the plan is to have one global set of hazard pointers for all the
possible use cases, supporting wildcard may be a problem. If we allow
different sets of hazard pointers for different use cases, it will be
less an issue. Anyway, maybe we should skip wildcard for the current
case so that we have more time to think through it first.
Cheers,
Longman
next prev parent reply other threads:[~2025-03-31 18:57 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-21 9:30 Breno Leitao
2025-03-21 10:37 ` Eric Dumazet
2025-03-21 14:22 ` Breno Leitao
2025-03-24 12:12 ` Peter Zijlstra
2025-03-24 12:23 ` Eric Dumazet
2025-03-24 12:24 ` Eric Dumazet
2025-03-24 19:21 ` Boqun Feng
2025-03-24 19:30 ` Boqun Feng
2025-03-25 0:47 ` Boqun Feng
2025-03-25 1:56 ` Waiman Long
2025-03-25 3:41 ` Boqun Feng
[not found] ` <934d794b-7ebc-422c-b4fe-3e658a2e5e7a@redhat.com>
2025-03-25 14:57 ` Waiman Long
2025-03-25 18:45 ` Boqun Feng
2025-03-25 19:23 ` Waiman Long
2025-03-25 19:42 ` Boqun Feng
2025-03-25 23:20 ` Waiman Long
2025-03-26 5:25 ` Boqun Feng
[not found] ` <df237702-55c3-466b-b51e-f3fe46ae03ba@redhat.com>
2025-03-26 16:40 ` Waiman Long
2025-03-26 16:47 ` Boqun Feng
2025-03-26 17:02 ` Waiman Long
2025-03-26 17:10 ` Paul E. McKenney
2025-03-26 18:42 ` Boqun Feng
2025-03-26 21:37 ` Paul E. McKenney
2025-03-31 16:48 ` Breno Leitao
2025-03-31 17:34 ` Boqun Feng
2025-03-31 17:26 ` Boqun Feng
2025-03-31 17:33 ` Waiman Long
2025-03-31 18:33 ` Paul E. McKenney
2025-03-31 18:57 ` Waiman Long [this message]
2025-03-31 21:21 ` Boqun Feng
2025-03-31 21:47 ` Waiman Long
2025-03-31 17:42 ` Eric Dumazet
2025-07-09 10:00 ` Breno Leitao
2025-07-09 13:57 ` Waiman Long
2025-07-09 14:57 ` Boqun Feng
2025-07-19 17:40 ` [tip: locking/core] " tip-bot2 for Breno Leitao
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=69592dc7-5c21-485b-b00e-1c34ffb4cee8@redhat.com \
--to=llong@redhat.com \
--cc=aeh@meta.com \
--cc=boqun.feng@gmail.com \
--cc=edumazet@google.com \
--cc=elundgren@meta.com \
--cc=jhs@mojatatu.com \
--cc=kernel-team@meta.com \
--cc=leitao@debian.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--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®