On Tue, Feb 04, 2025 at 07:52:51AM +0100, Thomas Weißschuh wrote: > Even if it's not critical, the avoidance of checking the error code > from devm_mutex_init() call today diminishes the point of using devm > variant of it. Tomorrow it may even leak something. Enforce all callers > checking the return value through the compiler. > > As devm_mutex_init() itself is a macro which can not be annotated, > annotate __devm_mutex_init() instead. > Unfortunately __must_check/warn_unused_result don't propagate through > statement expression. To work around this move the statement expression > into the argument list of the call to __devm_mutex_init() so > devm_mutex_init() directly expands to __devm_mutex_init(). > > Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx> > --- > include/linux/mutex.h | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/include/linux/mutex.h b/include/linux/mutex.h > index 2bf91b57591b49e4668752e773419ae945f124da..65b28c9e6efc123982d923d1ed171eae471c82c1 100644 > --- a/include/linux/mutex.h > +++ b/include/linux/mutex.h > @@ -126,11 +126,11 @@ do { \ > > #ifdef CONFIG_DEBUG_MUTEXES > > -int __devm_mutex_init(struct device *dev, struct mutex *lock); > +int __must_check __devm_mutex_init(struct device *dev, struct mutex *lock); > > #else > > -static inline int __devm_mutex_init(struct device *dev, struct mutex *lock) > +static inline int __must_check __devm_mutex_init(struct device *dev, struct mutex *lock) > { > /* > * When CONFIG_DEBUG_MUTEXES is off mutex_destroy() is just a nop so > @@ -141,13 +141,12 @@ static inline int __devm_mutex_init(struct device *dev, struct mutex *lock) > > #endif > > -#define devm_mutex_init(dev, mutex) \ > -({ \ > - typeof(mutex) mutex_ = (mutex); \ > - \ > - mutex_init(mutex_); \ > - __devm_mutex_init(dev, mutex_); \ > -}) > +#define devm_mutex_init(dev, mutex) __devm_mutex_init(dev, ({ \ > + typeof(mutex) mutex_ = (mutex); \ > + \ > + mutex_init(mutex_); \ > + mutex_; \ > +})) Urgh, that's a bit ugly isn't it. Now we can either write a helper for that like: #define mutex_init_ret(mutex) \ ({ \ typeof(mutex) mutex_ = (mutex); \ mutex_init(mutex_); \ mutex_; \ }) #define devm_mutex_init(dev, mutex) \ __devm_mutex_init(dev, mutex_init_ret(mutex)) Or we can try and make mutex_init() return the pointer itself. I don't think that will break anything, but its best to feel that to the robots to make sure.