diff options
Diffstat (limited to 'drivers/infiniband/core/rw.c')
| -rw-r--r-- | drivers/infiniband/core/rw.c | 31 | 
1 files changed, 20 insertions, 11 deletions
| diff --git a/drivers/infiniband/core/rw.c b/drivers/infiniband/core/rw.c index 4fad732f9b3c..06e5b6787443 100644 --- a/drivers/infiniband/core/rw.c +++ b/drivers/infiniband/core/rw.c @@ -273,6 +273,23 @@ static int rdma_rw_init_single_wr(struct rdma_rw_ctx *ctx, struct ib_qp *qp,  	return 1;  } +static void rdma_rw_unmap_sg(struct ib_device *dev, struct scatterlist *sg, +			     u32 sg_cnt, enum dma_data_direction dir) +{ +	if (is_pci_p2pdma_page(sg_page(sg))) +		pci_p2pdma_unmap_sg(dev->dma_device, sg, sg_cnt, dir); +	else +		ib_dma_unmap_sg(dev, sg, sg_cnt, dir); +} + +static int rdma_rw_map_sg(struct ib_device *dev, struct scatterlist *sg, +			  u32 sg_cnt, enum dma_data_direction dir) +{ +	if (is_pci_p2pdma_page(sg_page(sg))) +		return pci_p2pdma_map_sg(dev->dma_device, sg, sg_cnt, dir); +	return ib_dma_map_sg(dev, sg, sg_cnt, dir); +} +  /**   * rdma_rw_ctx_init - initialize a RDMA READ/WRITE context   * @ctx:	context to initialize @@ -295,11 +312,7 @@ int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,  	struct ib_device *dev = qp->pd->device;  	int ret; -	if (is_pci_p2pdma_page(sg_page(sg))) -		ret = pci_p2pdma_map_sg(dev->dma_device, sg, sg_cnt, dir); -	else -		ret = ib_dma_map_sg(dev, sg, sg_cnt, dir); - +	ret = rdma_rw_map_sg(dev, sg, sg_cnt, dir);  	if (!ret)  		return -ENOMEM;  	sg_cnt = ret; @@ -338,7 +351,7 @@ int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,  	return ret;  out_unmap_sg: -	ib_dma_unmap_sg(dev, sg, sg_cnt, dir); +	rdma_rw_unmap_sg(dev, sg, sg_cnt, dir);  	return ret;  }  EXPORT_SYMBOL(rdma_rw_ctx_init); @@ -588,11 +601,7 @@ void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,  		break;  	} -	if (is_pci_p2pdma_page(sg_page(sg))) -		pci_p2pdma_unmap_sg(qp->pd->device->dma_device, sg, -				    sg_cnt, dir); -	else -		ib_dma_unmap_sg(qp->pd->device, sg, sg_cnt, dir); +	rdma_rw_unmap_sg(qp->pd->device, sg, sg_cnt, dir);  }  EXPORT_SYMBOL(rdma_rw_ctx_destroy); |