Re: [PATCH] lockdep: constify usage of struct lock_class_key where possible

From: Waiman Long

Date: Wed Apr 29 2026 - 16:36:44 EST


On 4/29/26 3:40 PM, Heiner Kallweit wrote:
On 29.04.2026 19:04, Waiman Long wrote:
On 4/28/26 5:05 PM, Heiner Kallweit wrote:
Constify usage of struct lock_class_key where possible. This requires
to constify also usage of struct lockdep_subclass_key in two places.

Especially relevant is constification of lockdep_map.key, as it makes
clear that the key isn't changed during lifetime of struct lockdep_map.
Other than making clear that the lock_class_key isn't being modified, is there other benefit of making this change like helping compiler to generate better code?

Doing an objdump -o kernel/locking/lockdep.o I see no difference in section
sizes. Hence at least with gcc it doesn't seem to affect code generation.
I didn't check whether it affects callers of e.g. lockdep_init_map_wait().

I asked because just stating the nature of the lock_class_key doesn't contribute much to the lockdep code. I am not against this change, but it is up others to decide if they will take the patch.

Cheers,
Longman


Cheers,
Longman

Signed-off-by: Heiner Kallweit <hkallweit1@xxxxxxxxx>
---
  include/linux/lockdep.h       | 18 ++++++++++--------
  include/linux/lockdep_types.h |  2 +-
  kernel/locking/lockdep.c      | 12 ++++++------
  3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 621566345..3fa2b62f2 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -125,25 +125,27 @@ extern void lockdep_unregister_key(struct lock_class_key *key);
   * to lockdep:
   */
  -extern void lockdep_init_map_type(struct lockdep_map *lock, const char *name,
-    struct lock_class_key *key, int subclass, u8 inner, u8 outer, u8 lock_type);
+void lockdep_init_map_type(struct lockdep_map *lock, const char *name,
+               const struct lock_class_key *key, int subclass,
+               u8 inner, u8 outer, u8 lock_type);
    static inline void
  lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
-               struct lock_class_key *key, int subclass, u8 inner, u8 outer)
+               const struct lock_class_key *key, int subclass,
+               u8 inner, u8 outer)
  {
      lockdep_init_map_type(lock, name, key, subclass, inner, outer, LD_LOCK_NORMAL);
  }
    static inline void
  lockdep_init_map_wait(struct lockdep_map *lock, const char *name,
-              struct lock_class_key *key, int subclass, u8 inner)
+              const struct lock_class_key *key, int subclass, u8 inner)
  {
      lockdep_init_map_waits(lock, name, key, subclass, inner, LD_WAIT_INV);
  }
    static inline void lockdep_init_map(struct lockdep_map *lock, const char *name,
-                 struct lock_class_key *key, int subclass)
+                    const struct lock_class_key *key, int subclass)
  {
      lockdep_init_map_wait(lock, name, key, subclass, LD_WAIT_INV);
  }
@@ -252,9 +254,9 @@ static inline int lock_is_held(const struct lockdep_map *lock)
  #define lockdep_is_held(lock)        lock_is_held(&(lock)->dep_map)
  #define lockdep_is_held_type(lock, r)    lock_is_held_type(&(lock)->dep_map, (r))
  -extern void lock_set_class(struct lockdep_map *lock, const char *name,
-               struct lock_class_key *key, unsigned int subclass,
-               unsigned long ip);
+void lock_set_class(struct lockdep_map *lock, const char *name,
+            const struct lock_class_key *key, unsigned int subclass,
+            unsigned long ip);
    #define lock_set_novalidate_class(l, n, i) \
      lock_set_class(l, n, &__lockdep_no_validate__, 0, i)
diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h
index eae115a26..0d3df9019 100644
--- a/include/linux/lockdep_types.h
+++ b/include/linux/lockdep_types.h
@@ -184,7 +184,7 @@ void clear_lock_stats(struct lock_class *class);
   * This is embedded into specific lock instances:
   */
  struct lockdep_map {
-    struct lock_class_key        *key;
+    const struct lock_class_key        *key;
      struct lock_class        *class_cache[NR_LOCKDEP_CACHING_CLASSES];
      const char            *name;
      u8                wait_type_outer; /* can be taken in this context */
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index f13883162..fe1415260 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -888,7 +888,7 @@ static int count_matching_names(struct lock_class *new_class)
  static noinstr struct lock_class *
  look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass)
  {
-    struct lockdep_subclass_key *key;
+    const struct lockdep_subclass_key *key;
      struct hlist_head *hash_head;
      struct lock_class *class;
  @@ -1286,7 +1286,7 @@ static bool is_dynamic_key(const struct lock_class_key *key)
  static struct lock_class *
  register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
  {
-    struct lockdep_subclass_key *key;
+    const struct lockdep_subclass_key *key;
      struct hlist_head *hash_head;
      struct lock_class *class;
      int idx;
@@ -4937,8 +4937,8 @@ static inline int check_wait_context(struct task_struct *curr,
   * Initialize a lock instance's lock-class mapping info:
   */
  void lockdep_init_map_type(struct lockdep_map *lock, const char *name,
-                struct lock_class_key *key, int subclass,
-                u8 inner, u8 outer, u8 lock_type)
+               const struct lock_class_key *key, int subclass,
+               u8 inner, u8 outer, u8 lock_type)
  {
      int i;
  @@ -5408,7 +5408,7 @@ static int reacquire_held_locks(struct task_struct *curr, unsigned int depth,
    static int
  __lock_set_class(struct lockdep_map *lock, const char *name,
-         struct lock_class_key *key, unsigned int subclass,
+         const struct lock_class_key *key, unsigned int subclass,
           unsigned long ip)
  {
      struct task_struct *curr = current;
@@ -5733,7 +5733,7 @@ static noinstr void check_flags(unsigned long flags)
  }
    void lock_set_class(struct lockdep_map *lock, const char *name,
-            struct lock_class_key *key, unsigned int subclass,
+            const struct lock_class_key *key, unsigned int subclass,
              unsigned long ip)
  {
      unsigned long flags;