From: Peter Zijlstra <peterz@infradead.org>
To: Breno Leitao <leitao@debian.org>
Cc: Ingo Molnar <mingo@redhat.com>, Will Deacon <will@kernel.org>,
Boqun Feng <boqun.feng@gmail.com>,
Waiman Long <longman@redhat.com>,
aeh@meta.com, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, edumazet@google.com, jhs@mojatatu.com,
kernel-team@meta.com, Erik Lundgren <elundgren@meta.com>,
"Paul E. McKenney" <paulmck@kernel.org>
Subject: Re: [PATCH] lockdep: Speed up lockdep_unregister_key() with expedited RCU synchronization
Date: Mon, 24 Mar 2025 13:12:02 +0100 [thread overview]
Message-ID: <20250324121202.GG14944@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <20250321-lockdep-v1-1-78b732d195fb@debian.org>
On Fri, Mar 21, 2025 at 02:30:49AM -0700, Breno Leitao wrote:
> lockdep_unregister_key() is called from critical code paths, including
> sections where rtnl_lock() is held. For example, when replacing a qdisc
> in a network device, network egress traffic is disabled while
> __qdisc_destroy() is called for every network queue.
>
> If lockdep is enabled, __qdisc_destroy() calls lockdep_unregister_key(),
> which gets blocked waiting for synchronize_rcu() to complete.
>
> For example, a simple tc command to replace a qdisc could take 13
> seconds:
>
> # time /usr/sbin/tc qdisc replace dev eth0 root handle 0x1: mq
> real 0m13.195s
> user 0m0.001s
> sys 0m2.746s
>
> During this time, network egress is completely frozen while waiting for
> RCU synchronization.
>
> Use synchronize_rcu_expedited() instead to minimize the impact on
> critical operations like network connectivity changes.
>
> This improves 10x the function call to tc, when replacing the qdisc for
> a network card.
>
> # time /usr/sbin/tc qdisc replace dev eth0 root handle 0x1: mq
> real 0m1.789s
> user 0m0.000s
> sys 0m1.613s
>
> Reported-by: Erik Lundgren <elundgren@meta.com>
> Signed-off-by: Breno Leitao <leitao@debian.org>
> Reviewed-by: "Paul E. McKenney" <paulmck@kernel.org>
> ---
> kernel/locking/lockdep.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> index 4470680f02269..a79030ac36dd4 100644
> --- a/kernel/locking/lockdep.c
> +++ b/kernel/locking/lockdep.c
> @@ -6595,8 +6595,10 @@ void lockdep_unregister_key(struct lock_class_key *key)
> if (need_callback)
> call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
>
> - /* Wait until is_dynamic_key() has finished accessing k->hash_entry. */
> - synchronize_rcu();
> + /* Wait until is_dynamic_key() has finished accessing k->hash_entry.
> + * This needs to be quick, since it is called in critical sections
> + */
> + synchronize_rcu_expedited();
> }
> EXPORT_SYMBOL_GPL(lockdep_unregister_key);
So I fundamentally despise synchronize_rcu_expedited(), also your
comment style is broken.
Why can't qdisc call this outside of the lock?
next prev parent reply other threads:[~2025-03-24 12:12 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-21 9:30 [PATCH] lockdep: Speed up lockdep_unregister_key() with expedited RCU synchronization Breno Leitao
2025-03-21 10:37 ` Eric Dumazet
2025-03-21 14:22 ` Breno Leitao
2025-03-24 12:12 ` Peter Zijlstra [this message]
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
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=20250324121202.GG14944@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--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=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=paulmck@kernel.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 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.