[Intel-gfx] [PATCH v4 02/61] drm/i915: Add missing -EDEADLK handling to execbuf pinning

Matthew Brost matthew.brost at intel.com
Tue Oct 20 20:18:21 UTC 2020


On Fri, Oct 16, 2020 at 12:43:45PM +0200, Maarten Lankhorst wrote:
> i915_vma_pin may fail with -EDEADLK when we start locking page tables,
> so ensure we handle this correctly.
> 
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> ---
>  .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 23 +++++++++++++++----
>  1 file changed, 18 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> index a199336792fb..0f5efced0b87 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> @@ -419,13 +419,14 @@ static u64 eb_pin_flags(const struct drm_i915_gem_exec_object2 *entry,
>  	return pin_flags;
>  }
>  
> -static inline bool
> +static inline int
>  eb_pin_vma(struct i915_execbuffer *eb,
>  	   const struct drm_i915_gem_exec_object2 *entry,
>  	   struct eb_vma *ev)
>  {
>  	struct i915_vma *vma = ev->vma;
>  	u64 pin_flags;
> +	int err;
>  
>  	if (vma->node.size)
>  		pin_flags = vma->node.start;
> @@ -438,16 +439,24 @@ eb_pin_vma(struct i915_execbuffer *eb,
>  
>  	/* Attempt to reuse the current location if available */
>  	/* TODO: Add -EDEADLK handling here */

Drop the TODO?

> -	if (unlikely(i915_vma_pin_ww(vma, &eb->ww, 0, 0, pin_flags))) {
> +	err = i915_vma_pin_ww(vma, &eb->ww, 0, 0, pin_flags);
> +	if (err == -EDEADLK)
> +		return err;
> +
> +	if (unlikely(err)) {
>  		if (entry->flags & EXEC_OBJECT_PINNED)
>  			return false;
>  
>  		/* Failing that pick any _free_ space if suitable */
> -		if (unlikely(i915_vma_pin_ww(vma, &eb->ww,
> +		err = i915_vma_pin_ww(vma, &eb->ww,
>  					     entry->pad_to_size,
>  					     entry->alignment,
>  					     eb_pin_flags(entry, ev->flags) |
> -					     PIN_USER | PIN_NOEVICT)))
> +					     PIN_USER | PIN_NOEVICT);
> +		if (err == -EDEADLK)
> +			return err;
> +
> +		if (unlikely(err))
>  			return false;

Confusing to return a boolean 'false' while the return value of this
function is an int. Return '0' if that is the intent, which I believe it
based on how the caller handles the return. 

>  	}
>  
> @@ -900,7 +909,11 @@ static int eb_validate_vmas(struct i915_execbuffer *eb)
>  		if (err)
>  			return err;
>  

Can't say I love the triple comparison of the return values, but if you
need to do this I'd put all of comparison in the same clause. Just my
opinion.

Matt

> -		if (eb_pin_vma(eb, entry, ev)) {
> +		err = eb_pin_vma(eb, entry, ev);
> +		if (err < 0)
> +			return err;
> +
> +		if (err > 0) {
>  			if (entry->offset != vma->node.start) {
>  				entry->offset = vma->node.start | UPDATE;
>  				eb->args->flags |= __EXEC_HAS_RELOC;
> -- 
> 2.28.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list