On Thu, 22 Apr 2010 22:38:41 +0100, "Owain G. Ainsworth" <zer...@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 <o...@openbsd.org>
Minor comment inline. Reviewed-by: Chris Wilson <ch...@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 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx