]> Git Repo - linux.git/commitdiff
drm/modeset-lock: Take the modeset BKL for legacy drivers
authorDaniel Vetter <[email protected]>
Fri, 14 Aug 2020 09:38:42 +0000 (11:38 +0200)
committerAlex Deucher <[email protected]>
Mon, 17 Aug 2020 17:41:50 +0000 (13:41 -0400)
This fell off in the conversion in

commit 9bcaa3fe58ab7559e71df798bcff6e0795158695
Author: Michal Orzel <[email protected]>
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 <[email protected]>
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 <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Maarten Lankhorst <[email protected]>
Cc: Maxime Ripard <[email protected]>
Cc: Thomas Zimmermann <[email protected]>
Cc: David Airlie <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: [email protected]
Cc: <[email protected]> # v5.8+
Signed-off-by: Daniel Vetter <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
drivers/gpu/drm/drm_atomic_helper.c
drivers/gpu/drm/drm_color_mgmt.c
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_mode_object.c
drivers/gpu/drm/drm_plane.c
include/drm/drm_modeset_lock.h

index 85d163f16801f72c851e8605857c632b1c6af10c..b78e142a5620c0a08b7adf34ba6c48374dfc804b 100644 (file)
@@ -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>
@@ -3105,7 +3106,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);
 
@@ -3245,7 +3246,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);
 
@@ -3326,7 +3327,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;
index c93123ff7c2186beead154597b21ba58f81c93c9..138ff34b31db53aaf4cfc90f0fc198a7ce51de64 100644 (file)
@@ -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;
 
 }
index 4936e1080e4171b8d05448b45b698c4bff123f0e..eb1c33e5d0f4956b6ddc97346ad90417c0b6aae1 100644 (file)
@@ -561,7 +561,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);
 
@@ -728,8 +727,7 @@ out:
        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;
 }
index 901b078abf40c5d7bf1819e6f6cd4ac256c4f774..db05f386a709e8d9cd5edc305455fb31e6e25128 100644 (file)
@@ -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;
 }
index 4af173ced32772e1b23ca173ec983cf3fbeb1ae6..fdbafc2b81998d5a348614be35ff2b1caa0ba10a 100644 (file)
@@ -791,7 +791,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;
 }
index 4fc9a43ac45a8f3c61b5542ae423747adb21056a..aafd07388eb7bf4dc852fb8ad480742bbbb64403 100644 (file)
@@ -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_ */
This page took 0.081306 seconds and 4 git commands to generate.