Re: [PATCH v5 02/10] locking/mutex: introduce devm_mutex_init
From: Waiman Long <longman@redhat.com>
Date: 2024-03-12 01:10:25
Also in:
linux-leds, lkml
On 3/11/24 19:47, George Stark wrote:
quoted hunk ↗ jump to hunk
Hello Waiman, Marek Thanks for the review. I've never used lockdep for debug but it seems preferable to keep that feature working. It could be look like this:diff --git a/include/linux/mutex.h b/include/linux/mutex.h index f7611c092db7..574f6de6084d 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h@@ -22,6 +22,8 @@#include <linux/cleanup.h> #include <linux/mutex_types.h> +struct device; + #ifdef CONFIG_DEBUG_LOCK_ALLOC # define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ , .dep_map = { \@@ -115,10 +117,31 @@ do { \#ifdef CONFIG_DEBUG_MUTEXES +int debug_devm_mutex_init(struct device *dev, struct mutex *lock); + +#define devm_mutex_init(dev, mutex) \ +({ \ + int ret; \ + mutex_init(mutex); \ + ret = debug_devm_mutex_init(dev, mutex); \ + ret; \ +})
The int ret variable is not needed. The macro can just end with debug_devm_mutex_init().
+ void mutex_destroy(struct mutex *lock); #else +/* +* When CONFIG_DEBUG_MUTEXES is off mutex_destroy is just a nop so +* there's no really need to register it in devm subsystem.
"no really need"?
+*/
+#define devm_mutex_init(dev, mutex) \
+({ \
+ typecheck(struct device *, dev); \
+ mutex_init(mutex); \
+ 0; \
+})Do we need a typecheck() here? Compilation will fail with CONFIG_DEBUG_MUTEXES if dev is not a device pointer.
quoted hunk ↗ jump to hunk
+ static inline void mutex_destroy(struct mutex *lock) {} #endifdiff --git a/kernel/locking/mutex-debug.c b/kernel/locking/mutex-debug.c index bc8abb8549d2..967a5367c79a 100644 --- a/kernel/locking/mutex-debug.c +++ b/kernel/locking/mutex-debug.c@@ -19,6 +19,7 @@#include <linux/kallsyms.h> #include <linux/interrupt.h> #include <linux/debug_locks.h> +#include <linux/device.h> #include "mutex.h"@@ -89,6 +90,16 @@ void debug_mutex_init(struct mutex *lock, constchar *name, lock->magic = lock; } +static void devm_mutex_release(void *res) +{ + mutex_destroy(res); +} + +int debug_devm_mutex_init(struct device *dev, struct mutex *lock) +{ + return devm_add_action_or_reset(dev, devm_mutex_release, lock); +} + /*** * mutex_destroy - mark a mutex unusable * @lock: the mutex to be destroyed