[Intel-gfx] [PATCH v2 14/61] drm/i915: Fix userptr so we do not have to worry about obj->mm.lock, v2.

Thomas Hellström (Intel) thomas_os at shipmail.org
Mon Oct 12 17:05:04 UTC 2020


On 10/12/20 4:46 PM, Maarten Lankhorst wrote:
> Instead of doing what we do currently, which will never work with
> PROVE_LOCKING, do the same as AMD does, and something similar to
> relocation slowpath. When all locks are dropped, we acquire the
> pages for pinning. When the locks are taken, we transfer those
> pages in .get_pages() to the bo. As a final check before installing
> the fences, we ensure that the mmu notifier was not called; if it is,
> we return -EAGAIN to userspace to signal it has to start over.
>
> Changes since v1:
> - Unbinding is done in submit_init only. submit_begin() removed.

Perhaps an early check for invalidation instead of submit_init?

> - MMU_NOTFIER -> MMU_NOTIFIER
>

...

> -		ret = i915_gem_object_unbind(obj,
> -					     I915_GEM_OBJECT_UNBIND_ACTIVE |
> -					     I915_GEM_OBJECT_UNBIND_BARRIER);
> -		if (ret == 0)
> -			ret = __i915_gem_object_put_pages(obj);
> -		i915_gem_object_put(obj);
> -		if (ret)
> -			return ret;
> +	mutex_lock(&i915->mm.notifier_lock);
>   
> -		spin_lock(&mn->lock);
> +	mmu_interval_set_seq(mni, cur_seq);
>   
> -		/*
> -		 * As we do not (yet) protect the mmu from concurrent insertion
> -		 * over this range, there is no guarantee that this search will
> -		 * terminate given a pathologic workload.
> -		 */
> -		it = interval_tree_iter_first(&mn->objects, range->start, end);
> -	}
> -	spin_unlock(&mn->lock);
> +	mutex_unlock(&i915->mm.notifier_lock);
>   

Could we perhaps make use of the fact that we attach the fence before 
checking for invalidation and thus ditch the per mm mm.notifier_lock 
completely, that is

execbuf:

attach_fence();
smp_mb();
check_seqno_for_invalidation();

notifier:

set_seqno_for_invalidation();
smp_mb();
wait_for_fence().

The other stuff protected by that lock appears to be per object only and 
could be kept under a per object spinlock or perhaps mutex. 
obj->userptr.lock?

/Thomas




More information about the Intel-gfx mailing list