]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rust: mutex: fix __mutex_init() usage in case of PREEMPT_RT
authorDirk Behme <dirk.behme@de.bosch.com>
Mon, 16 Sep 2024 07:37:52 +0000 (09:37 +0200)
committerMiguel Ojeda <ojeda@kernel.org>
Thu, 26 Sep 2024 19:22:15 +0000 (21:22 +0200)
In case CONFIG_PREEMPT_RT is enabled __mutex_init() becomes a macro
instead of an extern function (simplified from
include/linux/mutex.h):

    #ifndef CONFIG_PREEMPT_RT
    extern void __mutex_init(struct mutex *lock, const char *name,
      struct lock_class_key *key);
    #else
    #define __mutex_init(mutex, name, key) \
    do { \
rt_mutex_base_init(&(mutex)->rtmutex); \
     __mutex_rt_init((mutex), name, key); \
    } while (0)
    #endif

The macro isn't resolved by bindgen, then. What results in a build
error:

error[E0425]: cannot find function `__mutex_init` in crate `bindings`
     --> rust/kernel/sync/lock/mutex.rs:104:28
      |
104   |           unsafe { bindings::__mutex_init(ptr, name, key) }
      |                              ^^^^^^^^^^^^ help: a function with a similar name exists: `__mutex_rt_init`
      |
     ::: rust/bindings/bindings_generated.rs:23722:5
      |
23722 | /     pub fn __mutex_rt_init(
23723 | |         lock: *mut mutex,
23724 | |         name: *const core::ffi::c_char,
23725 | |         key: *mut lock_class_key,
23726 | |     );
      | |_____- similarly named function `__mutex_rt_init` defined here

Fix this by adding a helper.

As explained by Gary Guo in [1] no #ifdef CONFIG_PREEMPT_RT
is needed here as rust/bindings/lib.rs prefers externed function to
helpers if an externed function exists.

Reported-by: Conor Dooley <conor@kernel.org>
Link: https://lore.kernel.org/rust-for-linux/20240913-shack-estate-b376a65921b1@spud/
Link: https://lore.kernel.org/rust-for-linux/20240915123626.1a170103.gary@garyguo.net/
Fixes: 6d20d629c6d8 ("rust: lock: introduce `Mutex`")
Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
Tested-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
Link: https://lore.kernel.org/r/20240916073752.3123484-1-dirk.behme@de.bosch.com
[ Reworded to include the proper example by Dirk. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
rust/helpers/mutex.c

index 200db7e6279f0f11f59da15ed2cbb0332a9d830e..a17ca8cdb50ca0a8412c600eea6143d18488099a 100644 (file)
@@ -7,3 +7,9 @@ void rust_helper_mutex_lock(struct mutex *lock)
 {
        mutex_lock(lock);
 }
+
+void rust_helper___mutex_init(struct mutex *mutex, const char *name,
+                             struct lock_class_key *key)
+{
+       __mutex_init(mutex, name, key);
+}