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
