[Intel-gfx] [PATCH] drm/i915: Avoid undefined behaviour of "u32 >> 32"

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Thu Jun 29 14:50:17 UTC 2017


On 29/06/2017 14:49, Chris Wilson wrote:
> When computing a hash for looking up relcoation target handles in an
> execbuf, we start with a large size for the hashtable and proceed to
> reduce it until the allocation suceeds. The final attempt is with an
> order of 0 (i.e. a single element). This means that we then pass bits=0
> to hash_32() which then computes "hash >> (32 - 0)" to lookup the single
> element. Right shifting by a value the width of the operand is
> undefined, so limit the smallest hash table we use to order 1.
> 
> Fixes: 4ff4b44cbb70 ("drm/i915: Store a direct lookup from object handle to vma")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>   drivers/gpu/drm/i915/i915_gem_execbuffer.c | 22 +++++++++++-----------
>   1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 718bb75ad387..54791bcb8ccb 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -296,12 +296,8 @@ static int eb_create(struct i915_execbuffer *eb)
>   				break;
>   		} while (--size);
>   
> -		if (unlikely(!eb->buckets)) {
> -			eb->buckets = kzalloc(sizeof(struct hlist_head),
> -					      GFP_TEMPORARY);

Want to maybe drop the NORETRY | NOWARN from the remaining allocation 
now? Wasn't it recently discussed that it is to feeble in it's attempts 
to allocate?

> -			if (unlikely(!eb->buckets))
> -				return -ENOMEM;
> -		}
> +		if (unlikely(!eb->buckets))
> +			return -ENOMEM;
>   
>   		eb->lut_size = size;
>   	} else {
> @@ -453,7 +449,7 @@ eb_add_vma(struct i915_execbuffer *eb,
>   			return err;
>   	}
>   
> -	if (eb->lut_size >= 0) {
> +	if (eb->lut_size > 0) {
>   		vma->exec_handle = entry->handle;
>   		hlist_add_head(&vma->exec_node,
>   			       &eb->buckets[hash_32(entry->handle,
> @@ -897,7 +893,7 @@ static void eb_release_vmas(const struct i915_execbuffer *eb)
>   static void eb_reset_vmas(const struct i915_execbuffer *eb)
>   {
>   	eb_release_vmas(eb);
> -	if (eb->lut_size >= 0)
> +	if (eb->lut_size > 0)
>   		memset(eb->buckets, 0,
>   		       sizeof(struct hlist_head) << eb->lut_size);
>   }
> @@ -906,7 +902,7 @@ static void eb_destroy(const struct i915_execbuffer *eb)
>   {
>   	GEM_BUG_ON(eb->reloc_cache.rq);
>   
> -	if (eb->lut_size >= 0)
> +	if (eb->lut_size > 0)
>   		kfree(eb->buckets);
>   }
>   
> @@ -2185,8 +2181,11 @@ i915_gem_do_execbuffer(struct drm_device *dev,
>   		}
>   	}
>   
> -	if (eb_create(&eb))
> -		return -ENOMEM;
> +	err = eb_create(&eb);
> +	if (err)
> +		goto err_out_fence;
> +
> +	GEM_BUG_ON(!eb.lut_size);
>   
>   	err = eb_select_context(&eb);
>   	if (unlikely(err))
> @@ -2346,6 +2345,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
>   	i915_gem_context_put(eb.ctx);
>   err_destroy:
>   	eb_destroy(&eb);
> +err_out_fence:
>   	if (out_fence_fd != -1)
>   		put_unused_fd(out_fence_fd);
>   err_in_fence:
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the Intel-gfx mailing list