diff options
author | Devesh Sharma <devesh.sharma@emulex.com> | 2014-09-05 10:05:40 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-10-10 12:43:01 -0400 |
commit | 1b76d38332271d5a0468ae5e465c5ea534c473c6 (patch) | |
tree | ac7fb58ebad72710e11a385a1d0d5f3c2e54994e | |
parent | bf67472ca1fac19c81367601bd4ba7d17bdc9f6e (diff) |
RDMA/ocrdma: Convert kernel VA to PA for mmap in user
In some platforms, when iommu is enabled, the bus address returned by
dma_alloc_coherent is different than the physical address. ocrdma
should use physical address for mmap-ing the queue memory for the
applications.
This patch adds the use of virt_to_phys() at all such places where
kernel buffer is mapped to user process context.
Signed-off-by: Devesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index 8f5f2577f288..ef6c78c2f6b9 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | |||
@@ -388,7 +388,7 @@ struct ib_ucontext *ocrdma_alloc_ucontext(struct ib_device *ibdev, | |||
388 | 388 | ||
389 | memset(&resp, 0, sizeof(resp)); | 389 | memset(&resp, 0, sizeof(resp)); |
390 | resp.ah_tbl_len = ctx->ah_tbl.len; | 390 | resp.ah_tbl_len = ctx->ah_tbl.len; |
391 | resp.ah_tbl_page = ctx->ah_tbl.pa; | 391 | resp.ah_tbl_page = virt_to_phys(ctx->ah_tbl.va); |
392 | 392 | ||
393 | status = ocrdma_add_mmap(ctx, resp.ah_tbl_page, resp.ah_tbl_len); | 393 | status = ocrdma_add_mmap(ctx, resp.ah_tbl_page, resp.ah_tbl_len); |
394 | if (status) | 394 | if (status) |
@@ -870,7 +870,7 @@ static int ocrdma_copy_cq_uresp(struct ocrdma_dev *dev, struct ocrdma_cq *cq, | |||
870 | uresp.page_size = PAGE_ALIGN(cq->len); | 870 | uresp.page_size = PAGE_ALIGN(cq->len); |
871 | uresp.num_pages = 1; | 871 | uresp.num_pages = 1; |
872 | uresp.max_hw_cqe = cq->max_hw_cqe; | 872 | uresp.max_hw_cqe = cq->max_hw_cqe; |
873 | uresp.page_addr[0] = cq->pa; | 873 | uresp.page_addr[0] = virt_to_phys(cq->va); |
874 | uresp.db_page_addr = ocrdma_get_db_addr(dev, uctx->cntxt_pd->id); | 874 | uresp.db_page_addr = ocrdma_get_db_addr(dev, uctx->cntxt_pd->id); |
875 | uresp.db_page_size = dev->nic_info.db_page_size; | 875 | uresp.db_page_size = dev->nic_info.db_page_size; |
876 | uresp.phase_change = cq->phase_change ? 1 : 0; | 876 | uresp.phase_change = cq->phase_change ? 1 : 0; |
@@ -1123,13 +1123,13 @@ static int ocrdma_copy_qp_uresp(struct ocrdma_qp *qp, | |||
1123 | uresp.sq_dbid = qp->sq.dbid; | 1123 | uresp.sq_dbid = qp->sq.dbid; |
1124 | uresp.num_sq_pages = 1; | 1124 | uresp.num_sq_pages = 1; |
1125 | uresp.sq_page_size = PAGE_ALIGN(qp->sq.len); | 1125 | uresp.sq_page_size = PAGE_ALIGN(qp->sq.len); |
1126 | uresp.sq_page_addr[0] = qp->sq.pa; | 1126 | uresp.sq_page_addr[0] = virt_to_phys(qp->sq.va); |
1127 | uresp.num_wqe_allocated = qp->sq.max_cnt; | 1127 | uresp.num_wqe_allocated = qp->sq.max_cnt; |
1128 | if (!srq) { | 1128 | if (!srq) { |
1129 | uresp.rq_dbid = qp->rq.dbid; | 1129 | uresp.rq_dbid = qp->rq.dbid; |
1130 | uresp.num_rq_pages = 1; | 1130 | uresp.num_rq_pages = 1; |
1131 | uresp.rq_page_size = PAGE_ALIGN(qp->rq.len); | 1131 | uresp.rq_page_size = PAGE_ALIGN(qp->rq.len); |
1132 | uresp.rq_page_addr[0] = qp->rq.pa; | 1132 | uresp.rq_page_addr[0] = virt_to_phys(qp->rq.va); |
1133 | uresp.num_rqe_allocated = qp->rq.max_cnt; | 1133 | uresp.num_rqe_allocated = qp->rq.max_cnt; |
1134 | } | 1134 | } |
1135 | uresp.db_page_addr = usr_db; | 1135 | uresp.db_page_addr = usr_db; |
@@ -1680,7 +1680,7 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_dev *dev, struct ocrdma_srq *srq, | |||
1680 | memset(&uresp, 0, sizeof(uresp)); | 1680 | memset(&uresp, 0, sizeof(uresp)); |
1681 | uresp.rq_dbid = srq->rq.dbid; | 1681 | uresp.rq_dbid = srq->rq.dbid; |
1682 | uresp.num_rq_pages = 1; | 1682 | uresp.num_rq_pages = 1; |
1683 | uresp.rq_page_addr[0] = srq->rq.pa; | 1683 | uresp.rq_page_addr[0] = virt_to_phys(srq->rq.va); |
1684 | uresp.rq_page_size = srq->rq.len; | 1684 | uresp.rq_page_size = srq->rq.len; |
1685 | uresp.db_page_addr = dev->nic_info.unmapped_db + | 1685 | uresp.db_page_addr = dev->nic_info.unmapped_db + |
1686 | (srq->pd->id * dev->nic_info.db_page_size); | 1686 | (srq->pd->id * dev->nic_info.db_page_size); |