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

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Fri Oct 30 08:43:51 UTC 2020


Op 20-10-2020 om 22:18 schreef Matthew Brost:
> 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. 

Yeah, I think it makes more sense to change eb_pin_vma to a proper int, instead of a special one.

In most places we can just propagate the error. I will respin this patch. :)

>>  	}
>>  
>> @@ -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.
Neither. I think I will just special case -EDEADLK, which should be easy with the fix to eb_pin_vma I suggested above.
>
> 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