Having the ma_external_lock field exist when CONFIG_LOCKDEP=n isn't used
anywhere, so just get rid of it. This also avoids generating a typedef
called lockdep_map_p that could overlap with typedefs in other header
files.
With this change, bindgen will generate better definitions for this
union, which makes it nicer to use from Rust. This avoids a cast in the
Rust abstractions for the maple tree, ensuring that Rust's type checker
will notice at build-time if ma_lock is changed from spinlock_t to
something else.
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
---
include/linux/maple_tree.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/linux/maple_tree.h b/include/linux/maple_tree.h
index bafe143b1f783202e27b32567fffee4149e8e266..8244679ba1758235e049acbaedee62aae5c0e226 100644
--- a/include/linux/maple_tree.h
+++ b/include/linux/maple_tree.h
@@ -194,7 +194,6 @@ enum store_type {
#define MAPLE_RESERVED_RANGE 4096
#ifdef CONFIG_LOCKDEP
-typedef struct lockdep_map *lockdep_map_p;
#define mt_lock_is_held(mt) \
(!(mt)->ma_external_lock || lock_is_held((mt)->ma_external_lock))
@@ -207,7 +206,6 @@ typedef struct lockdep_map *lockdep_map_p;
#define mt_on_stack(mt) (mt).ma_external_lock = NULL
#else
-typedef struct { /* nothing */ } lockdep_map_p;
#define mt_lock_is_held(mt) 1
#define mt_write_lock_is_held(mt) 1
#define mt_set_external_lock(mt, lock) do { } while (0)
@@ -230,8 +228,10 @@ typedef struct { /* nothing */ } lockdep_map_p;
*/
struct maple_tree {
union {
- spinlock_t ma_lock;
- lockdep_map_p ma_external_lock;
+ spinlock_t ma_lock;
+#ifdef CONFIG_LOCKDEP
+ struct lockdep_map *ma_external_lock;
+#endif
};
unsigned int ma_flags;
void __rcu *ma_root;
--
2.51.0.rc1.167.g924127e9c0-goog
On Tue, Aug 19, 2025 at 10:34:42AM +0000, Alice Ryhl wrote: > Having the ma_external_lock field exist when CONFIG_LOCKDEP=n isn't used > anywhere, so just get rid of it. This also avoids generating a typedef > called lockdep_map_p that could overlap with typedefs in other header > files. > > With this change, bindgen will generate better definitions for this > union, which makes it nicer to use from Rust. This avoids a cast in the > Rust abstractions for the maple tree, ensuring that Rust's type checker > will notice at build-time if ma_lock is changed from spinlock_t to > something else. > > Signed-off-by: Alice Ryhl <aliceryhl@google.com> Ah ... this didn't work. There's still a configuration where I get the error: ERROR:root:error[E0308]: mismatched types --> ../rust/kernel/maple_tree.rs:256:18 | 254 | fn ma_lock(&self) -> *mut bindings::spinlock_t { | ------------------------- expected `*mut bindings::spinlock` because of return type 255 | // SAFETY: This pointer offset operation stays in-bounds. 256 | unsafe { &raw mut (*self.tree.get()).__bindgen_anon_1.ma_lock } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `*mut spinlock`, found `*mut __BindgenUnionField<spinlock>` | = note: expected raw pointer `*mut bindings::spinlock` found raw pointer `*mut bindings::__BindgenUnionField<bindings::spinlock>` Alice
On Tue Aug 19, 2025 at 12:34 PM CEST, Alice Ryhl wrote: > Having the ma_external_lock field exist when CONFIG_LOCKDEP=n isn't used > anywhere, so just get rid of it. This also avoids generating a typedef > called lockdep_map_p that could overlap with typedefs in other header > files. > > With this change, bindgen will generate better definitions for this > union, which makes it nicer to use from Rust. This avoids a cast in the > Rust abstractions for the maple tree, ensuring that Rust's type checker > will notice at build-time if ma_lock is changed from spinlock_t to > something else. > > Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Danilo Krummrich <dakr@kernel.org>
© 2016 - 2025 Red Hat, Inc.