intel_engine_pm_put(ce->engine);
 }
 
+static int
+move_obj_to_gpu(struct drm_i915_gem_object *obj,
+               struct i915_request *rq,
+               bool write)
+{
+       if (obj->cache_dirty & ~obj->cache_coherent)
+               i915_gem_clflush_object(obj, 0);
+
+       return i915_request_await_object(rq, obj, write);
+}
+
 int i915_gem_object_fill_blt(struct drm_i915_gem_object *obj,
                             struct intel_context *ce,
                             u32 value)
        if (unlikely(err))
                return err;
 
-       if (obj->cache_dirty & ~obj->cache_coherent) {
-               i915_gem_object_lock(obj);
-               i915_gem_clflush_object(obj, 0);
-               i915_gem_object_unlock(obj);
-       }
-
        batch = intel_emit_vma_fill_blt(ce, vma, value);
        if (IS_ERR(batch)) {
                err = PTR_ERR(batch);
        if (unlikely(err))
                goto out_request;
 
-       err = i915_request_await_object(rq, obj, true);
-       if (unlikely(err))
-               goto out_request;
-
-       if (ce->engine->emit_init_breadcrumb) {
-               err = ce->engine->emit_init_breadcrumb(rq);
-               if (unlikely(err))
-                       goto out_request;
-       }
-
        i915_vma_lock(vma);
-       err = i915_request_await_object(rq, vma->obj, true);
+       err = move_obj_to_gpu(vma->obj, rq, true);
        if (err == 0)
                err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
        i915_vma_unlock(vma);
        if (unlikely(err))
                goto out_request;
 
-       err = ce->engine->emit_bb_start(rq,
-                                       batch->node.start, batch->node.size,
-                                       0);
+       if (ce->engine->emit_init_breadcrumb)
+               err = ce->engine->emit_init_breadcrumb(rq);
+
+       if (likely(!err))
+               err = ce->engine->emit_bb_start(rq,
+                                               batch->node.start,
+                                               batch->node.size,
+                                               0);
 out_request:
        if (unlikely(err))
                i915_request_set_error_once(rq, err);
        return ERR_PTR(err);
 }
 
-static int move_to_gpu(struct i915_vma *vma, struct i915_request *rq, bool write)
-{
-       struct drm_i915_gem_object *obj = vma->obj;
-
-       if (obj->cache_dirty & ~obj->cache_coherent)
-               i915_gem_clflush_object(obj, 0);
-
-       return i915_request_await_object(rq, obj, write);
-}
-
 int i915_gem_object_copy_blt(struct drm_i915_gem_object *src,
                             struct drm_i915_gem_object *dst,
                             struct intel_context *ce)
                goto out_request;
 
        for (i = 0; i < ARRAY_SIZE(vma); i++) {
-               err = move_to_gpu(vma[i], rq, i);
+               err = move_obj_to_gpu(vma[i]->obj, rq, i);
                if (unlikely(err))
                        goto out_unlock;
        }