From nobody Fri Dec 19 06:01:36 2025 Received: from out-178.mta0.migadu.com (out-178.mta0.migadu.com [91.218.175.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A07C32A1CA for ; Sun, 30 Jun 2024 05:10:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719724252; cv=none; b=GGPGoJCbLhka3F9f4ZMju8dzSiXayZ8xKeng14DLCf+dazHGrT0PeHdKrPamnA5NPkQAjcYi//uQ8Gsno/LNsK4i2lLWkDLd+tDkxmN8YPLM5sibWz9LhPZM8h5xGPak3SiL9wjJTZdEzdtwuMwgpoc6YX2zNL0jJvyQDxl0Ers= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719724252; c=relaxed/simple; bh=APznGUgYsRThb6+4qKwTVD/XcKIOxyFQcp+sHQXNTM4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=sP4tML8IEqzfyphrd30tFQ9BmFt4QmLErFcqmzGyDUpYrgfAwgCW+b0u4ufCpWzZZVL1X+ctyxojABTZr1Du0x9NZ4ozKPDHAI1K9Zlz2oi/AhYunv9vzbbYelIhvbZXGCtgkcBEJZBy0V73OYryP8WV6AceMdnemynathnTXng= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=sfnQob2k; arc=none smtp.client-ip=91.218.175.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="sfnQob2k" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1719724244; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=ARRcOdKPAtRj/LcHeZVJZ9MMAM+Nz+wFvMcLsWwfcXo=; b=sfnQob2kK16ixhik7PyuyQ029R0sm95hRKXSduT72A54hxWr/p0hgvB7AWLVcJ8VxrE+qU oGPsI2RuOHlISXEYNvnkeUtgIdpCXteMAy5vRIj15QIfUvZ6CqXBeRSQkdVCfE7V+WtCUZ DQzUcIbaaGHRYsYCX1n4mTFUVySjHV0= X-Envelope-To: linux-bcachefs@vger.kernel.org X-Envelope-To: kent.overstreet@linux.dev X-Envelope-To: peterz@infradead.org X-Envelope-To: mingo@redhat.com X-Envelope-To: will@kernel.org X-Envelope-To: longman@redhat.com X-Envelope-To: boqun.feng@gmail.com X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Kent Overstreet To: linux-kernel@vger.kernel.org, linux-bcachefs@vger.kernel.org Cc: Kent Overstreet , Peter Zijlstra , Ingo Molnar , Will Deacon , Waiman Long , Boqun Feng Subject: [PATCH] lockdep: lockdep_set_notrack_class() Date: Sun, 30 Jun 2024 01:10:37 -0400 Message-ID: <20240630051037.2785156-1-kent.overstreet@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Add a new helper to disable lockdep tracking entirely for a given class. This is needed for bcachefs, which takes too many btree node locks for lockdep to track. Instead, we have a single lockdep_map for "btree_trans has any btree nodes locked", which makes more since given that we have centralized lock management and a cycle detector. Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Will Deacon Cc: Waiman Long Cc: Boqun Feng Signed-off-by: Kent Overstreet --- fs/bcachefs/btree_locking.c | 2 +- include/linux/lockdep.h | 4 ++++ include/linux/lockdep_types.h | 1 + kernel/locking/lockdep.c | 9 ++++++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c index 79057cde4c41..16834a6b4c3d 100644 --- a/fs/bcachefs/btree_locking.c +++ b/fs/bcachefs/btree_locking.c @@ -10,7 +10,7 @@ void bch2_btree_lock_init(struct btree_bkey_cached_common= *b, enum six_lock_init_flags flags) { __six_lock_init(&b->lock, "b->c.lock", &bch2_btree_node_lock_key, flags); - lockdep_set_novalidate_class(&b->lock); + lockdep_set_notrack_class(&b->lock); } =20 #ifdef CONFIG_LOCKDEP diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 08b0d1d9d78b..b76f1bcd2f7f 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -181,6 +181,9 @@ static inline void lockdep_init_map(struct lockdep_map = *lock, const char *name, #define lockdep_set_novalidate_class(lock) \ lockdep_set_class_and_name(lock, &__lockdep_no_validate__, #lock) =20 +#define lockdep_set_notrack_class(lock) \ + lockdep_set_class_and_name(lock, &__lockdep_no_track__, #lock) + /* * Compare locking classes */ @@ -338,6 +341,7 @@ static inline void lockdep_set_selftest_task(struct tas= k_struct *task) #define lockdep_set_subclass(lock, sub) do { } while (0) =20 #define lockdep_set_novalidate_class(lock) do { } while (0) +#define lockdep_set_notrack_class(lock) do { } while (0) =20 /* * We don't define lockdep_match_class() and lockdep_match_key() for !LOCK= DEP diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h index 70d30d40ea4a..9f361d3ab9d9 100644 --- a/include/linux/lockdep_types.h +++ b/include/linux/lockdep_types.h @@ -80,6 +80,7 @@ struct lock_class_key { }; =20 extern struct lock_class_key __lockdep_no_validate__; +extern struct lock_class_key __lockdep_no_track__; =20 struct lock_trace; =20 diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index 151bd3de5936..b6bb9fcd992a 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -4918,6 +4918,9 @@ EXPORT_SYMBOL_GPL(lockdep_init_map_type); struct lock_class_key __lockdep_no_validate__; EXPORT_SYMBOL_GPL(__lockdep_no_validate__); =20 +struct lock_class_key __lockdep_no_track__; +EXPORT_SYMBOL_GPL(__lockdep_no_track__); + #ifdef CONFIG_PROVE_LOCKING void lockdep_set_lock_cmp_fn(struct lockdep_map *lock, lock_cmp_fn cmp_fn, lock_print_fn print_fn) @@ -5002,6 +5005,9 @@ static int __lock_acquire(struct lockdep_map *lock, u= nsigned int subclass, if (unlikely(!debug_locks)) return 0; =20 + if (unlikely(lock->key =3D=3D &__lockdep_no_track__)) + return 0; + if (!prove_locking || lock->key =3D=3D &__lockdep_no_validate__) check =3D 0; =20 @@ -5764,7 +5770,8 @@ void lock_release(struct lockdep_map *lock, unsigned = long ip) =20 trace_lock_release(lock, ip); =20 - if (unlikely(!lockdep_enabled())) + if (unlikely(!lockdep_enabled() || + lock->key =3D=3D &__lockdep_no_track__)) return; =20 raw_local_irq_save(flags); --=20 2.45.2