diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gem.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_userptr.c | 6 | ||||
| -rw-r--r-- | drivers/infiniband/core/umem_odp.c | 7 | 
3 files changed, 15 insertions, 5 deletions
| diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c index 5ce3603e6eac..0370b842d9cc 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -748,19 +748,22 @@ static struct page **etnaviv_gem_userptr_do_get_pages(  	int ret = 0, pinned, npages = etnaviv_obj->base.size >> PAGE_SHIFT;  	struct page **pvec;  	uintptr_t ptr; +	unsigned int flags = 0;  	pvec = drm_malloc_ab(npages, sizeof(struct page *));  	if (!pvec)  		return ERR_PTR(-ENOMEM); +	if (!etnaviv_obj->userptr.ro) +		flags |= FOLL_WRITE; +  	pinned = 0;  	ptr = etnaviv_obj->userptr.ptr;  	down_read(&mm->mmap_sem);  	while (pinned < npages) {  		ret = get_user_pages_remote(task, mm, ptr, npages - pinned, -					    !etnaviv_obj->userptr.ro, 0, -					    pvec + pinned, NULL); +					    flags, pvec + pinned, NULL);  		if (ret < 0)  			break; diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index e537930c64b5..c6f780f5abc9 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c @@ -508,6 +508,10 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)  	pvec = drm_malloc_gfp(npages, sizeof(struct page *), GFP_TEMPORARY);  	if (pvec != NULL) {  		struct mm_struct *mm = obj->userptr.mm->mm; +		unsigned int flags = 0; + +		if (!obj->userptr.read_only) +			flags |= FOLL_WRITE;  		ret = -EFAULT;  		if (atomic_inc_not_zero(&mm->mm_users)) { @@ -517,7 +521,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)  					(work->task, mm,  					 obj->userptr.ptr + pinned * PAGE_SIZE,  					 npages - pinned, -					 !obj->userptr.read_only, 0, +					 flags,  					 pvec + pinned, NULL);  				if (ret < 0)  					break; diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c index 75077a018675..1f0fe3217f23 100644 --- a/drivers/infiniband/core/umem_odp.c +++ b/drivers/infiniband/core/umem_odp.c @@ -527,6 +527,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 user_virt, u64 bcnt,  	u64 off;  	int j, k, ret = 0, start_idx, npages = 0;  	u64 base_virt_addr; +	unsigned int flags = 0;  	if (access_mask == 0)  		return -EINVAL; @@ -556,6 +557,9 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 user_virt, u64 bcnt,  		goto out_put_task;  	} +	if (access_mask & ODP_WRITE_ALLOWED_BIT) +		flags |= FOLL_WRITE; +  	start_idx = (user_virt - ib_umem_start(umem)) >> PAGE_SHIFT;  	k = start_idx; @@ -574,8 +578,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 user_virt, u64 bcnt,  		 */  		npages = get_user_pages_remote(owning_process, owning_mm,  				user_virt, gup_num_pages, -				access_mask & ODP_WRITE_ALLOWED_BIT, -				0, local_page_list, NULL); +				flags, local_page_list, NULL);  		up_read(&owning_mm->mmap_sem);  		if (npages < 0) |