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.lankho...@linux.intel.com>
Cc: Boris Brezillon <boris.brezil...@free-electrons.com>
---
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c 
b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 516d9547d331..64f54dc7dd68 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -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;
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to