drm/managed: Add DRM-managed alloc_ordered_workqueue

Add drmm_alloc_ordered_workqueue(), a helper that provides managed ordered
workqueue cleanup. The workqueue will be destroyed with the final
reference of the DRM device.

Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20250116-google-vkms-managed-v9-3-3e4ae1bd05a0@bootlin.com
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
This commit is contained in:
Louis Chauvet 2025-01-16 18:47:15 +01:00
parent 16d22ba2de
commit c367b772e6
No known key found for this signature in database
GPG Key ID: 20AD2EC65B102CE2
2 changed files with 20 additions and 0 deletions

View File

@ -310,3 +310,11 @@ void __drmm_mutex_release(struct drm_device *dev, void *res)
mutex_destroy(lock);
}
EXPORT_SYMBOL(__drmm_mutex_release);
void __drmm_workqueue_release(struct drm_device *device, void *res)
{
struct workqueue_struct *wq = res;
destroy_workqueue(wq);
}
EXPORT_SYMBOL(__drmm_workqueue_release);

View File

@ -127,4 +127,16 @@ void __drmm_mutex_release(struct drm_device *dev, void *res);
drmm_add_action_or_reset(dev, __drmm_mutex_release, lock); \
}) \
void __drmm_workqueue_release(struct drm_device *device, void *wq);
#define drmm_alloc_ordered_workqueue(dev, fmt, flags, args...) \
({ \
struct workqueue_struct *wq = alloc_ordered_workqueue(fmt, flags, ##args); \
wq ? ({ \
int ret = drmm_add_action_or_reset(dev, __drmm_workqueue_release, wq); \
ret ? ERR_PTR(ret) : wq; \
}) : \
wq; \
})
#endif