[Intel-gfx] [FIXES 2/3] drm/i915/userptr: Handle unlocked gup retries
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Nov 11 14:19:31 UTC 2019
On 11/11/2019 13:32, Chris Wilson wrote:
> Enable gup to retry and fault the pages outside of the mmap_sem lock in
> our worker. As we are inside our worker, outside of any critical path,
> we can allow the mmap_sem lock to be dropped in order to service a page
> fault; this in turn allows the mm to populate the page using a slow
> fault handler.
>
> Testcase: igt/gem_userptr/userfault
There are no references or explanation on what does this fix?
Regards,
Tvrtko
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
> index dd104b0e2071..54ebc7ab71bc 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
> @@ -459,26 +459,31 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
> if (pvec != NULL) {
> struct mm_struct *mm = obj->userptr.mm->mm;
> unsigned int flags = 0;
> + int locked = 0;
>
> if (!i915_gem_object_is_readonly(obj))
> flags |= FOLL_WRITE;
>
> ret = -EFAULT;
> if (mmget_not_zero(mm)) {
> - down_read(&mm->mmap_sem);
> while (pinned < npages) {
> + if (!locked) {
> + down_read(&mm->mmap_sem);
> + locked = 1;
> + }
> ret = get_user_pages_remote
> (work->task, mm,
> obj->userptr.ptr + pinned * PAGE_SIZE,
> npages - pinned,
> flags,
> - pvec + pinned, NULL, NULL);
> + pvec + pinned, NULL, &locked);
> if (ret < 0)
> break;
>
> pinned += ret;
> }
> - up_read(&mm->mmap_sem);
> + if (locked)
> + up_read(&mm->mmap_sem);
> mmput(mm);
> }
> }
>
More information about the Intel-gfx
mailing list