From: Jan Kara jack@suse.cz
Hello,
Now when the usage of get_user_pages() in media drivers got cleaned up, here comes a series which removes knowledge about mmap_sem from a couple of other drivers. Patches are trivial and standalone but please check, they are only compile tested. If you are OK with them, either take them through your respective trees or ack them and I can take care of pushing them to Linus (probably through mm tree). Thanks.
After these patches there are some 12 call sites of get_user_pages() outside of core code (mostly infiniband and RDMA). So we are slowly getting to the goal of removing knowledge about page fault locking from drivers which will consequently allow us to change the locking rules with reasonable effort.
Honza
CC: Jesper Nilsson jesper.nilsson@axis.com CC: linux-cris-kernel@axis.com CC: Mikael Starvik starvik@axis.com CC: linux-ia64@vger.kernel.org CC: Tony Luck tony.luck@intel.com CC: David Airlie airlied@linux.ie CC: dri-devel@lists.freedesktop.org CC: Timur Tabi timur@freescale.com CC: linux-rdma@vger.kernel.org CC: Roland Dreier roland@kernel.org CC: Daniel Vetter daniel.vetter@intel.com CC: David Airlie airlied@linux.ie CC: dri-devel@lists.freedesktop.org CC: Andy Walls awalls@md.metrocast.net CC: linux-media@vger.kernel.org CC: Mauro Carvalho Chehab mchehab@osg.samsung.com
From: Jan Kara jack@suse.cz
CC: David Airlie airlied@linux.ie CC: dri-devel@lists.freedesktop.org Signed-off-by: Jan Kara jack@suse.cz --- drivers/gpu/drm/via/via_dmablit.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c index d0cbd5ecd7f0..d71add236e62 100644 --- a/drivers/gpu/drm/via/via_dmablit.c +++ b/drivers/gpu/drm/via/via_dmablit.c @@ -238,14 +238,10 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer) vsg->pages = vzalloc(sizeof(struct page *) * vsg->num_pages); if (NULL == vsg->pages) return -ENOMEM; - down_read(¤t->mm->mmap_sem); - ret = get_user_pages(current, current->mm, - (unsigned long)xfer->mem_addr, - vsg->num_pages, - (vsg->direction == DMA_FROM_DEVICE), - 0, vsg->pages, NULL); - - up_read(¤t->mm->mmap_sem); + ret = get_user_pages_fast((unsigned long)xfer->mem_addr, + vsg->num_pages, + (vsg->direction == DMA_FROM_DEVICE), + vsg->pages); if (ret != vsg->num_pages) { if (ret < 0) return ret;
From: Jan Kara jack@suse.cz
Convert __i915_gem_userptr_get_pages_worker() to use get_user_page_unlocked() so that we don't unnecessarily leak knowledge of mm locking into driver code.
CC: Daniel Vetter daniel.vetter@intel.com CC: David Airlie airlied@linux.ie CC: dri-devel@lists.freedesktop.org Signed-off-by: Jan Kara jack@suse.cz --- drivers/gpu/drm/i915/i915_gem_userptr.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index 8fd431bcdfd3..5138fe61d2fa 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c @@ -585,19 +585,18 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) if (pvec != NULL) { struct mm_struct *mm = obj->userptr.mm->mm;
- down_read(&mm->mmap_sem); while (pinned < num_pages) { - ret = get_user_pages(work->task, mm, - obj->userptr.ptr + pinned * PAGE_SIZE, - num_pages - pinned, - !obj->userptr.read_only, 0, - pvec + pinned, NULL); + ret = get_user_pages_unlocked( + work->task, mm, + obj->userptr.ptr + pinned * PAGE_SIZE, + num_pages - pinned, + !obj->userptr.read_only, 0, + pvec + pinned); if (ret < 0) break;
pinned += ret; } - up_read(&mm->mmap_sem); }
mutex_lock(&dev->struct_mutex);
dri-devel@lists.freedesktop.org