[Intel-gfx] [PATCH] drm/modeset-lock: Take the modeset BKL for legacy drivers
Alex Deucher
alexdeucher at gmail.com
Fri Aug 14 19:51:28 UTC 2020
On Fri, Aug 14, 2020 at 5:38 AM Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
>
> This fell off in the conversion in
>
> commit 9bcaa3fe58ab7559e71df798bcff6e0795158695
> Author: Michal Orzel <michalorzel.eng at gmail.com>
> Date: Tue Apr 28 19:10:04 2020 +0200
>
> drm: Replace drm_modeset_lock/unlock_all with DRM_MODESET_LOCK_ALL_* helpers
>
> but it's caught by the drm_warn_on_modeset_not_all_locked() that the
> legacy modeset code uses. Since this is the bkl and it's unclear
> what's all protected, play it safe and grab it again for legacy
> drivers.
>
> Unfortunately this means we need to sprinkle a few more #includes
> around.
>
> Also we need to add the drm_device as a parameter to the _END macro.
>
> Finally remove the mute_lock() from setcrtc, since that's now done by
> the macro.
>
> Cc: Alex Deucher <alexdeucher at gmail.com>
> References: https://gitlab.freedesktop.org/drm/amd/-/issues/1224
> Fixes: 9bcaa3fe58ab ("drm: Replace drm_modeset_lock/unlock_all with DRM_MODESET_LOCK_ALL_* helpers")
> Cc: Michal Orzel <michalorzel.eng at gmail.com>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> Cc: Maxime Ripard <mripard at kernel.org>
> Cc: Thomas Zimmermann <tzimmermann at suse.de>
> Cc: David Airlie <airlied at linux.ie>
> Cc: Daniel Vetter <daniel at ffwll.ch>
> Cc: dri-devel at lists.freedesktop.org
> Cc: <stable at vger.kernel.org> # v5.8+
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> --
> Patch compiles but otherwise untested, and I'll go on vacations now
> for 2 weeks. Alex, can you pls take care of this?
Looks good to me.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
Also confirmed to fix the issue. I'll push to drm-misc.
Thanks!
Alex
>
> Thanks, Daniel
> ---
> drivers/gpu/drm/drm_atomic_helper.c | 7 ++++---
> drivers/gpu/drm/drm_color_mgmt.c | 2 +-
> drivers/gpu/drm/drm_crtc.c | 4 +---
> drivers/gpu/drm/drm_mode_object.c | 4 ++--
> drivers/gpu/drm/drm_plane.c | 2 +-
> include/drm/drm_modeset_lock.h | 9 +++++++--
> 6 files changed, 16 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index f67ee513a7cc..7515a40b2056 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -34,6 +34,7 @@
> #include <drm/drm_bridge.h>
> #include <drm/drm_damage_helper.h>
> #include <drm/drm_device.h>
> +#include <drm/drm_drv.h>
> #include <drm/drm_plane_helper.h>
> #include <drm/drm_print.h>
> #include <drm/drm_self_refresh_helper.h>
> @@ -3109,7 +3110,7 @@ void drm_atomic_helper_shutdown(struct drm_device *dev)
> if (ret)
> DRM_ERROR("Disabling all crtc's during unload failed with %i\n", ret);
>
> - DRM_MODESET_LOCK_ALL_END(ctx, ret);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
> }
> EXPORT_SYMBOL(drm_atomic_helper_shutdown);
>
> @@ -3249,7 +3250,7 @@ struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
> }
>
> unlock:
> - DRM_MODESET_LOCK_ALL_END(ctx, err);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, err);
> if (err)
> return ERR_PTR(err);
>
> @@ -3330,7 +3331,7 @@ int drm_atomic_helper_resume(struct drm_device *dev,
>
> err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
>
> - DRM_MODESET_LOCK_ALL_END(ctx, err);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, err);
> drm_atomic_state_put(state);
>
> return err;
> diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c
> index c93123ff7c21..138ff34b31db 100644
> --- a/drivers/gpu/drm/drm_color_mgmt.c
> +++ b/drivers/gpu/drm/drm_color_mgmt.c
> @@ -294,7 +294,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
> crtc->gamma_size, &ctx);
>
> out:
> - DRM_MODESET_LOCK_ALL_END(ctx, ret);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
> return ret;
>
> }
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 283bcc4362ca..aecdd7ea26dc 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -588,7 +588,6 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
> if (crtc_req->mode_valid && !drm_lease_held(file_priv, plane->base.id))
> return -EACCES;
>
> - mutex_lock(&crtc->dev->mode_config.mutex);
> DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx,
> DRM_MODESET_ACQUIRE_INTERRUPTIBLE, ret);
>
> @@ -756,8 +755,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
> fb = NULL;
> mode = NULL;
>
> - DRM_MODESET_LOCK_ALL_END(ctx, ret);
> - mutex_unlock(&crtc->dev->mode_config.mutex);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
>
> return ret;
> }
> diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
> index 901b078abf40..db05f386a709 100644
> --- a/drivers/gpu/drm/drm_mode_object.c
> +++ b/drivers/gpu/drm/drm_mode_object.c
> @@ -428,7 +428,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
> out_unref:
> drm_mode_object_put(obj);
> out:
> - DRM_MODESET_LOCK_ALL_END(ctx, ret);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
> return ret;
> }
>
> @@ -470,7 +470,7 @@ static int set_property_legacy(struct drm_mode_object *obj,
> break;
> }
> drm_property_change_valid_put(prop, ref);
> - DRM_MODESET_LOCK_ALL_END(ctx, ret);
> + DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
>
> return ret;
> }
> diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
> index b7b90b3a2e38..affe1cfed009 100644
> --- a/drivers/gpu/drm/drm_plane.c
> +++ b/drivers/gpu/drm/drm_plane.c
> @@ -792,7 +792,7 @@ static int setplane_internal(struct drm_plane *plane,
> crtc_x, crtc_y, crtc_w, crtc_h,
> src_x, src_y, src_w, src_h, &ctx);
>
> - DRM_MODESET_LOCK_ALL_END(ctx, ret);
> + DRM_MODESET_LOCK_ALL_END(plane->dev, ctx, ret);
>
> return ret;
> }
> diff --git a/include/drm/drm_modeset_lock.h b/include/drm/drm_modeset_lock.h
> index 4fc9a43ac45a..aafd07388eb7 100644
> --- a/include/drm/drm_modeset_lock.h
> +++ b/include/drm/drm_modeset_lock.h
> @@ -164,6 +164,8 @@ int drm_modeset_lock_all_ctx(struct drm_device *dev,
> * is 0, so no error checking is necessary
> */
> #define DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, flags, ret) \
> + if (!drm_drv_uses_atomic_modeset(dev)) \
> + mutex_lock(&dev->mode_config.mutex); \
> drm_modeset_acquire_init(&ctx, flags); \
> modeset_lock_retry: \
> ret = drm_modeset_lock_all_ctx(dev, &ctx); \
> @@ -172,6 +174,7 @@ modeset_lock_retry: \
>
> /**
> * DRM_MODESET_LOCK_ALL_END - Helper to release and cleanup modeset locks
> + * @dev: drm device
> * @ctx: local modeset acquire context, will be dereferenced
> * @ret: local ret/err/etc variable to track error status
> *
> @@ -188,7 +191,7 @@ modeset_lock_retry: \
> * to that failure. In both of these cases the code between BEGIN/END will not
> * be run, so the failure will reflect the inability to grab the locks.
> */
> -#define DRM_MODESET_LOCK_ALL_END(ctx, ret) \
> +#define DRM_MODESET_LOCK_ALL_END(dev, ctx, ret) \
> modeset_lock_fail: \
> if (ret == -EDEADLK) { \
> ret = drm_modeset_backoff(&ctx); \
> @@ -196,6 +199,8 @@ modeset_lock_fail: \
> goto modeset_lock_retry; \
> } \
> drm_modeset_drop_locks(&ctx); \
> - drm_modeset_acquire_fini(&ctx);
> + drm_modeset_acquire_fini(&ctx); \
> + if (!drm_drv_uses_atomic_modeset(dev)) \
> + mutex_unlock(&dev->mode_config.mutex);
>
> #endif /* DRM_MODESET_LOCK_H_ */
> --
> 2.28.0
>
More information about the Intel-gfx
mailing list