]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
drm/atmel-hlcdc: Handle drm_atomic_helper_swap_state failure
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 11 Jul 2017 14:33:06 +0000 (16:33 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 26 Jul 2017 11:22:41 +0000 (13:22 +0200)
drm_atomic_helper_swap_state() will be changed to interruptible waiting
in the next few commits, so all drivers have to be changed to handling
failure.

Atmel tracks pending commits through dc->commit.pending, so it can
ignore the changes by setting stall = false. We never return failure in
this case, so make failure a BUG_ON.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Boris Brezillon <boris.brezillon@free-electrons.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170711143314.2148-5-maarten.lankhorst@linux.intel.com
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c

index 516d9547d331a87cf406d990509b65102d710702..64f54dc7dd680acf44a44eecb28ad0321b3e21f7 100644 (file)
@@ -539,14 +539,13 @@ static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev,
                dc->commit.pending = true;
        spin_unlock(&dc->commit.wait.lock);
 
-       if (ret) {
-               kfree(commit);
-               goto error;
-       }
+       if (ret)
+               goto err_free;
 
-       /* Swap the state, this is the point of no return. */
-       drm_atomic_helper_swap_state(state, true);
+       /* We have our own synchronization through the commit lock. */
+       BUG_ON(drm_atomic_helper_swap_state(state, false) < 0);
 
+       /* Swap state succeeded, this is the point of no return. */
        drm_atomic_state_get(state);
        if (async)
                queue_work(dc->wq, &commit->work);
@@ -555,6 +554,8 @@ static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev,
 
        return 0;
 
+err_free:
+       kfree(commit);
 error:
        drm_atomic_helper_cleanup_planes(dev, state);
        return ret;