diff options
Diffstat (limited to 'drivers/infiniband/core/umem.c')
| -rw-r--r-- | drivers/infiniband/core/umem.c | 6 | 
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index c68746ce6624..224ad274ea0b 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c @@ -94,6 +94,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,  	unsigned long dma_attrs = 0;  	struct scatterlist *sg, *sg_list_start;  	int need_release = 0; +	unsigned int gup_flags = FOLL_WRITE;  	if (dmasync)  		dma_attrs |= DMA_ATTR_WRITE_BARRIER; @@ -183,6 +184,9 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,  	if (ret)  		goto out; +	if (!umem->writable) +		gup_flags |= FOLL_FORCE; +  	need_release = 1;  	sg_list_start = umem->sg_head.sgl; @@ -190,7 +194,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,  		ret = get_user_pages(cur_base,  				     min_t(unsigned long, npages,  					   PAGE_SIZE / sizeof (struct page *)), -				     1, !umem->writable, page_list, vma_list); +				     gup_flags, page_list, vma_list);  		if (ret < 0)  			goto out;  | 
