diff options
author | Christian König <christian.koenig@amd.com> | 2017-09-03 09:22:06 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-12 14:24:00 -0400 |
commit | b72cf4fca2bb786e20864b5e8755105aa9626fb4 (patch) | |
tree | 0f3f739d3fdbe0b8c2a7510689f8fdf482da295d /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |
parent | 862095237c392887819e98018d6dc187d8c78726 (diff) |
drm/amdgpu: move taking mmap_sem into get_user_pages v2
This didn't helped as intended, just simplify the code.
v2: unlock mmap_sem in the error path as well
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 28e121984332..ea0378c8b049 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -622,6 +622,8 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) | |||
622 | if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) | 622 | if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) |
623 | flags |= FOLL_WRITE; | 623 | flags |= FOLL_WRITE; |
624 | 624 | ||
625 | down_read(¤t->mm->mmap_sem); | ||
626 | |||
625 | if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) { | 627 | if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) { |
626 | /* check that we only use anonymous memory | 628 | /* check that we only use anonymous memory |
627 | to prevent problems with writeback */ | 629 | to prevent problems with writeback */ |
@@ -629,8 +631,10 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) | |||
629 | struct vm_area_struct *vma; | 631 | struct vm_area_struct *vma; |
630 | 632 | ||
631 | vma = find_vma(gtt->usermm, gtt->userptr); | 633 | vma = find_vma(gtt->usermm, gtt->userptr); |
632 | if (!vma || vma->vm_file || vma->vm_end < end) | 634 | if (!vma || vma->vm_file || vma->vm_end < end) { |
635 | up_read(¤t->mm->mmap_sem); | ||
633 | return -EPERM; | 636 | return -EPERM; |
637 | } | ||
634 | } | 638 | } |
635 | 639 | ||
636 | do { | 640 | do { |
@@ -657,10 +661,12 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) | |||
657 | 661 | ||
658 | } while (pinned < ttm->num_pages); | 662 | } while (pinned < ttm->num_pages); |
659 | 663 | ||
664 | up_read(¤t->mm->mmap_sem); | ||
660 | return 0; | 665 | return 0; |
661 | 666 | ||
662 | release_pages: | 667 | release_pages: |
663 | release_pages(pages, pinned, 0); | 668 | release_pages(pages, pinned, 0); |
669 | up_read(¤t->mm->mmap_sem); | ||
664 | return r; | 670 | return r; |
665 | } | 671 | } |
666 | 672 | ||