Since we'll be allocating resources for kthread_create_worker() in the
next commit (which could fail and require us to clean up the mess),
let's simplify the cleanup process a bit by registering a
drm_vblank_init_release() action for each drm_vblank_crtc so they're
still cleaned up if we fail to initialize one of them.

Signed-off-by: Lyude Paul <[email protected]>
---
 drivers/gpu/drm/drm_vblank.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 758bf74e1cab..bf8de10c131f 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -491,16 +491,12 @@ static void vblank_disable_fn(struct timer_list *t)
 
 static void drm_vblank_init_release(struct drm_device *dev, void *ptr)
 {
-       unsigned int pipe;
-
-       for (pipe = 0; pipe < dev->num_crtcs; pipe++) {
-               struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
+       struct drm_vblank_crtc *vblank = ptr;
 
-               WARN_ON(READ_ONCE(vblank->enabled) &&
-                       drm_core_check_feature(dev, DRIVER_MODESET));
+       WARN_ON(READ_ONCE(vblank->enabled) &&
+               drm_core_check_feature(dev, DRIVER_MODESET));
 
-               del_timer_sync(&vblank->disable_timer);
-       }
+       del_timer_sync(&vblank->disable_timer);
 }
 
 /**
@@ -529,10 +525,6 @@ int drm_vblank_init(struct drm_device *dev, unsigned int 
num_crtcs)
 
        dev->num_crtcs = num_crtcs;
 
-       ret = drmm_add_action(dev, drm_vblank_init_release, NULL);
-       if (ret)
-               return ret;
-
        for (i = 0; i < num_crtcs; i++) {
                struct drm_vblank_crtc *vblank = &dev->vblank[i];
 
@@ -541,6 +533,12 @@ int drm_vblank_init(struct drm_device *dev, unsigned int 
num_crtcs)
                init_waitqueue_head(&vblank->queue);
                timer_setup(&vblank->disable_timer, vblank_disable_fn, 0);
                seqlock_init(&vblank->seqlock);
+
+               ret = drmm_add_action(dev, drm_vblank_init_release, vblank);
+               if (ret) {
+                       del_timer_sync(&vblank->disable_timer);
+                       return ret;
+               }
        }
 
        DRM_INFO("Supports vblank timestamp caching Rev 2 (21.10.2013).\n");
-- 
2.25.1

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to