Skip to content

Commit c21f11d

Browse files
matt-auldThomas Zimmermann
authored andcommitted
drm: fix drmm_mutex_init()
In mutex_init() lockdep identifies a lock by defining a special static key for each lock class. However if we wrap the macro in a function, like in drmm_mutex_init(), we end up generating: int drmm_mutex_init(struct drm_device *dev, struct mutex *lock) { static struct lock_class_key __key; __mutex_init((lock), "lock", &__key); .... } The static __key here is what lockdep uses to identify the lock class, however since this is just a normal function the key here will be created once, where all callers then use the same key. In effect the mutex->depmap.key will be the same pointer for different drmm_mutex_init() callers. This then results in impossible lockdep splats since lockdep thinks completely unrelated locks are the same lock class. To fix this turn drmm_mutex_init() into a macro such that it generates a different "static struct lock_class_key __key" for each invocation, which looks to be inline with what mutex_init() wants. v2: - Revamp the commit message with clearer explanation of the issue. - Rather export __drmm_mutex_release() than static inline. Reported-by: Thomas Hellström <[email protected]> Reported-by: Sarah Walker <[email protected]> Fixes: e13f13e ("drm: Add DRM-managed mutex_init()") Cc: Stanislaw Gruszka <[email protected]> Cc: Boris Brezillon <[email protected]> Cc: Thomas Zimmermann <[email protected]> Cc: Jocelyn Falempe <[email protected]> Cc: Daniel Vetter <[email protected]> Cc: [email protected] Signed-off-by: Matthew Auld <[email protected]> Reviewed-by: Boris Brezillon <[email protected]> Reviewed-by: Stanislaw Gruszka <[email protected]> Reviewed-by: Lucas De Marchi <[email protected]> Acked-by: Thomas Zimmermann <[email protected]> Signed-off-by: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent aa8bf93 commit c21f11d

File tree

2 files changed

+19
-21
lines changed

2 files changed

+19
-21
lines changed

drivers/gpu/drm/drm_managed.c

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -264,28 +264,10 @@ void drmm_kfree(struct drm_device *dev, void *data)
264264
}
265265
EXPORT_SYMBOL(drmm_kfree);
266266

267-
static void drmm_mutex_release(struct drm_device *dev, void *res)
267+
void __drmm_mutex_release(struct drm_device *dev, void *res)
268268
{
269269
struct mutex *lock = res;
270270

271271
mutex_destroy(lock);
272272
}
273-
274-
/**
275-
* drmm_mutex_init - &drm_device-managed mutex_init()
276-
* @dev: DRM device
277-
* @lock: lock to be initialized
278-
*
279-
* Returns:
280-
* 0 on success, or a negative errno code otherwise.
281-
*
282-
* This is a &drm_device-managed version of mutex_init(). The initialized
283-
* lock is automatically destroyed on the final drm_dev_put().
284-
*/
285-
int drmm_mutex_init(struct drm_device *dev, struct mutex *lock)
286-
{
287-
mutex_init(lock);
288-
289-
return drmm_add_action_or_reset(dev, drmm_mutex_release, lock);
290-
}
291-
EXPORT_SYMBOL(drmm_mutex_init);
273+
EXPORT_SYMBOL(__drmm_mutex_release);

include/drm/drm_managed.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,22 @@ char *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp);
105105

106106
void drmm_kfree(struct drm_device *dev, void *data);
107107

108-
int drmm_mutex_init(struct drm_device *dev, struct mutex *lock);
108+
void __drmm_mutex_release(struct drm_device *dev, void *res);
109+
110+
/**
111+
* drmm_mutex_init - &drm_device-managed mutex_init()
112+
* @dev: DRM device
113+
* @lock: lock to be initialized
114+
*
115+
* Returns:
116+
* 0 on success, or a negative errno code otherwise.
117+
*
118+
* This is a &drm_device-managed version of mutex_init(). The initialized
119+
* lock is automatically destroyed on the final drm_dev_put().
120+
*/
121+
#define drmm_mutex_init(dev, lock) ({ \
122+
mutex_init(lock); \
123+
drmm_add_action_or_reset(dev, __drmm_mutex_release, lock); \
124+
}) \
109125

110126
#endif

0 commit comments

Comments
 (0)