drm: Fix locking cargo-cult in encoder/plane init/cleanup
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 29 Nov 2016 09:45:38 +0000 (10:45 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 29 Nov 2016 22:34:36 +0000 (23:34 +0100)
Encoders&planes can't be hotplugged, we dont need locking for this
since it's all single-threaded driver setup/teardown code. CRTCs
already don't grab locks.

While at it I noticed that plane's are missing the
drm_modeset_lock_fini() call, so add it.

Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161129094538.9650-1-daniel.vetter@ffwll.ch
drivers/gpu/drm/drm_encoder.c
drivers/gpu/drm/drm_plane.c

index 5c067719164d9a6c3ea93146fb47c8f7725bf198..992879f15f237b5ccd42e7f5300c851e35f3bcf1 100644 (file)
@@ -110,11 +110,9 @@ int drm_encoder_init(struct drm_device *dev,
 {
        int ret;
 
-       drm_modeset_lock_all(dev);
-
        ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER);
        if (ret)
-               goto out_unlock;
+               return ret;
 
        encoder->dev = dev;
        encoder->encoder_type = encoder_type;
@@ -142,9 +140,6 @@ out_put:
        if (ret)
                drm_mode_object_unregister(dev, &encoder->base);
 
-out_unlock:
-       drm_modeset_unlock_all(dev);
-
        return ret;
 }
 EXPORT_SYMBOL(drm_encoder_init);
@@ -164,12 +159,10 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
         * the indices on the drm_encoder after us in the encoder_list.
         */
 
-       drm_modeset_lock_all(dev);
        drm_mode_object_unregister(dev, &encoder->base);
        kfree(encoder->name);
        list_del(&encoder->head);
        dev->mode_config.num_encoder--;
-       drm_modeset_unlock_all(dev);
 
        memset(encoder, 0, sizeof(*encoder));
 }
index 419ac313c36faf42a3c95c778a3cd9a9be7d70bd..9147aab182c4eab18bfe26ccf1a578a969028634 100644 (file)
@@ -221,7 +221,8 @@ void drm_plane_cleanup(struct drm_plane *plane)
 {
        struct drm_device *dev = plane->dev;
 
-       drm_modeset_lock_all(dev);
+       drm_modeset_lock_fini(&plane->mutex);
+
        kfree(plane->format_types);
        drm_mode_object_unregister(dev, &plane->base);
 
@@ -236,7 +237,6 @@ void drm_plane_cleanup(struct drm_plane *plane)
        dev->mode_config.num_total_plane--;
        if (plane->type == DRM_PLANE_TYPE_OVERLAY)
                dev->mode_config.num_overlay_plane--;
-       drm_modeset_unlock_all(dev);
 
        WARN_ON(plane->state && !plane->funcs->atomic_destroy_state);
        if (plane->state && plane->funcs->atomic_destroy_state)