[Intel-gfx] [PATCH 1/2] drm/i915: check execbuffer for validity earlier to save on work.
Chris Wilson
chris at chris-wilson.co.uk
Fri Apr 23 00:15:20 CEST 2010
On Thu, 22 Apr 2010 22:38:41 +0100, "Owain G. Ainsworth" <zerooa at googlemail.com> wrote:
> Before, we were waiting until we knew the batch object's gtt offset
> before we checked for validity. However, since this is purely an
> alignment check (it is impossible for the batch object to get to
> execbuffer stage without being pinned and bound) we can check alignment
> before we do any other expensive work.
>
> Additionally, check that batch_start_offset + batch_len is <= the size
> of the batchbuffer object. And that batch_len and batch_start_offset do
> not overflow a u_int32_t.
>
> Signed-off-by: Owain G. Ainsworth <oga at openbsd.org>
Minor comment inline.
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 42 ++++++++++++++------------------------
> 1 files changed, 16 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index b85727c..a9da182 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3656,23 +3656,6 @@ err:
> return ret;
> }
>
> -static int
> -i915_gem_check_execbuffer (struct drm_i915_gem_execbuffer2 *exec,
> - uint64_t exec_offset)
> -{
> - uint32_t exec_start, exec_len;
> -
> - exec_start = (uint32_t) exec_offset + exec->batch_start_offset;
> - exec_len = (uint32_t) exec->batch_len;
> -
> - if ((exec_start | exec_len) & 0x7)
> - return -EINVAL;
> -
> - if (!exec_start)
> - return -EINVAL;
> -
> - return 0;
> -}
>
> static int
> i915_gem_wait_for_pending_flip(struct drm_device *dev,
> @@ -3722,7 +3705,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
> struct drm_clip_rect *cliprects = NULL;
> struct drm_i915_gem_relocation_entry *relocs = NULL;
> int ret = 0, ret2, i, pinned = 0;
> - uint64_t exec_offset;
> uint32_t seqno, flush_domains, reloc_index;
> int pin_tries, flips;
>
> @@ -3730,6 +3712,16 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
> DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n",
> (int) args->buffers_ptr, args->buffer_count, args->batch_len);
> #endif
> + /*
> + * check for valid execbuffer offset. We can do this early because
> + * bound objects are always page aligned, so only the start offset
> + * matters. Also check for overflow.
> + */
> + if ((args->batch_start_offset | args->batch_len) & 0x7 ||
> + args->batch_start_offset + args->batch_len < args->batch_len ||
> + args->batch_start_offset + args->batch_len <
> + args->batch_start_offset)
> + return -EINVAL;
A minor critique, can we move this predicate into an inline for the sake
of the reader? i915_gem_check_execbuffer_offset(args) perhaps?
-ickle
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list