|
@@ -2634,15 +2634,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
|
|
|
|
|
|
i915_verify_inactive(dev, __FILE__, __LINE__);
|
|
|
|
|
|
- /* Copy the new buffer offsets back to the user's exec list. */
|
|
|
- ret = copy_to_user((struct drm_i915_relocation_entry __user *)
|
|
|
- (uintptr_t) args->buffers_ptr,
|
|
|
- exec_list,
|
|
|
- sizeof(*exec_list) * args->buffer_count);
|
|
|
- if (ret)
|
|
|
- DRM_ERROR("failed to copy %d exec entries "
|
|
|
- "back to user (%d)\n",
|
|
|
- args->buffer_count, ret);
|
|
|
err:
|
|
|
for (i = 0; i < pinned; i++)
|
|
|
i915_gem_object_unpin(object_list[i]);
|
|
@@ -2652,6 +2643,18 @@ err:
|
|
|
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
|
|
|
+ if (!ret) {
|
|
|
+ /* Copy the new buffer offsets back to the user's exec list. */
|
|
|
+ ret = copy_to_user((struct drm_i915_relocation_entry __user *)
|
|
|
+ (uintptr_t) args->buffers_ptr,
|
|
|
+ exec_list,
|
|
|
+ sizeof(*exec_list) * args->buffer_count);
|
|
|
+ if (ret)
|
|
|
+ DRM_ERROR("failed to copy %d exec entries "
|
|
|
+ "back to user (%d)\n",
|
|
|
+ args->buffer_count, ret);
|
|
|
+ }
|
|
|
+
|
|
|
pre_mutex_err:
|
|
|
drm_free(object_list, sizeof(*object_list) * args->buffer_count,
|
|
|
DRM_MEM_DRIVER);
|