From: Thomas Hellström <[email protected]> drm_dev_unplug() marks a device as unplugged and waits for existing drm_dev_enter() users to finish before releasing device resources.
Drivers may need the same publish-and-drain sequence for their own device state without unplugging the device. Export drm_dev_srcu_synchronize() so drivers can publish their state and wait for existing DRM SRCU readers to finish. The Xe driver will use this helper to block device access during PCI error recovery and permanent wedge isolation. Cc: Matthew Brost <[email protected]> Cc: Himal Prasad Ghimiray <[email protected]> Cc: Rodrigo Vivi <[email protected]> Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Thomas Hellström <[email protected]> Signed-off-by: Arvind Yadav <[email protected]> --- drivers/gpu/drm/drm_drv.c | 17 ++++++++++++++++- include/drm/drm_drv.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 0cdc606af8d1..0f25103e9037 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -476,6 +476,21 @@ void drm_dev_exit(int idx) } EXPORT_SYMBOL(drm_dev_exit); +/** + * drm_dev_srcu_synchronize - Drain device SRCU readers + * @dev: DRM device whose state change is being synchronized + * + * Wait for existing drm_dev_enter() users to finish. + * + * The SRCU domain is shared by all DRM devices. Readers for other DRM + * devices may also delay this function. + */ +void drm_dev_srcu_synchronize(struct drm_device *dev) +{ + synchronize_srcu(&drm_unplug_srcu); +} +EXPORT_SYMBOL(drm_dev_srcu_synchronize); + /* * Mark the device as unplugged and wait for any in-flight drm_dev_enter() * critical sections to complete. @@ -489,7 +504,7 @@ static void drm_dev_synchronize_unplug(struct drm_device *dev) * finished. */ dev->unplugged = true; - synchronize_srcu(&drm_unplug_srcu); + drm_dev_srcu_synchronize(dev); } /** diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h index b23830494ed4..27361fbad6dc 100644 --- a/include/drm/drm_drv.h +++ b/include/drm/drm_drv.h @@ -482,6 +482,7 @@ void drm_dev_put(struct drm_device *dev); void drm_put_dev(struct drm_device *dev); bool drm_dev_enter(struct drm_device *dev, int *idx); void drm_dev_exit(int idx); +void drm_dev_srcu_synchronize(struct drm_device *dev); void drm_dev_unplug(struct drm_device *dev); int drm_dev_wedged_event(struct drm_device *dev, unsigned long method, struct drm_wedge_task_info *info); -- 2.43.0
