Move atomic_state allocation to the beginning of the atomic_ioctl
to accommodate drm_mode_atomic_err_code usage for returning error
code on failures.
As atomic state is required for drm_mode_atomic_err_code to store the
error codes.

v7: Reframe commit message (Suraj)
v8: Moved the clearing fence change to a different patch (Suraj/Louis)
v9: Free allocated atomic_state before return on error, move this change
from patch 5 (Suraj)

Signed-off-by: Arun R Murthy <[email protected]>
---
 drivers/gpu/drm/drm_atomic_uapi.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_uapi.c 
b/drivers/gpu/drm/drm_atomic_uapi.c
index 
dc013a22bf265512a4fa1edf0ae90931ff0d35e6..c228c9aed75acdb09a80df5dad54440a5c182254
 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1576,6 +1576,14 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
        if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
                return -EOPNOTSUPP;
 
+       state = drm_atomic_state_alloc(dev);
+       if (!state)
+               return -ENOMEM;
+
+       drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
+       state->acquire_ctx = &ctx;
+       state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET);
+
        /* disallow for userspace that has not enabled atomic cap (even
         * though this may be a bit overkill, since legacy userspace
         * wouldn't know how to call this ioctl)
@@ -1583,24 +1591,28 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
        if (!file_priv->atomic) {
                drm_dbg_atomic(dev,
                               "commit failed: atomic cap not enabled\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
 
        if (arg->flags & ~DRM_MODE_ATOMIC_FLAGS) {
                drm_dbg_atomic(dev, "commit failed: invalid flag\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
 
        if (arg->reserved) {
                drm_dbg_atomic(dev, "commit failed: reserved field set\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
 
        if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) {
                if (!dev->mode_config.async_page_flip) {
                        drm_dbg_atomic(dev,
                                       "commit failed: DRM_MODE_PAGE_FLIP_ASYNC 
not supported\n");
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto out;
                }
 
                async_flip = true;
@@ -1611,16 +1623,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
                        (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) {
                drm_dbg_atomic(dev,
                               "commit failed: page-flip event requested with 
test-only commit\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
 
-       state = drm_atomic_state_alloc(dev);
-       if (!state)
-               return -ENOMEM;
-
-       drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
-       state->acquire_ctx = &ctx;
-       state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET);
        state->plane_color_pipeline = file_priv->plane_color_pipeline;
 
 retry:

-- 
2.25.1

Reply via email to