Commit 0c8dac88 authored by John Harrison's avatar John Harrison Committed by Daniel Vetter

drm/i915: Early alloc request in execbuff

Start of explicit request management in the execbuffer code path. This patch
adds a call to allocate a request structure before all the actual hardware work
is done. Thus guaranteeing that all that work is tagged by a known request. At
present, nothing further is done with the request, the rest comes later in the
series.

The only noticable change is that failure to get a request (e.g. due to lack of
memory) will be caught earlier in the sequence. It now occurs right at the start
before any un-undoable work has been done.

v2: Simplified the error handling path.

For: VIZ-5115
Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Reviewed-by: default avatarTomas Elf <tomas.elf@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent bf7dc5b7
...@@ -1611,10 +1611,16 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, ...@@ -1611,10 +1611,16 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
} else } else
exec_start += i915_gem_obj_offset(batch_obj, vm); exec_start += i915_gem_obj_offset(batch_obj, vm);
/* Allocate a request for this batch buffer nice and early. */
ret = i915_gem_request_alloc(ring, ctx);
if (ret)
goto err_batch_unpin;
ret = dev_priv->gt.execbuf_submit(dev, file, ring, ctx, args, ret = dev_priv->gt.execbuf_submit(dev, file, ring, ctx, args,
&eb->vmas, batch_obj, exec_start, &eb->vmas, batch_obj, exec_start,
dispatch_flags); dispatch_flags);
err_batch_unpin:
/* /*
* FIXME: We crucially rely upon the active tracking for the (ppgtt) * FIXME: We crucially rely upon the active tracking for the (ppgtt)
* batch vma for correctness. For less ugly and less fragility this * batch vma for correctness. For less ugly and less fragility this
...@@ -1623,6 +1629,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, ...@@ -1623,6 +1629,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
*/ */
if (dispatch_flags & I915_DISPATCH_SECURE) if (dispatch_flags & I915_DISPATCH_SECURE)
i915_gem_object_ggtt_unpin(batch_obj); i915_gem_object_ggtt_unpin(batch_obj);
err: err:
/* the request owns the ref now */ /* the request owns the ref now */
i915_gem_context_unreference(ctx); i915_gem_context_unreference(ctx);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment