aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/sw/rdmavt/mr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/sw/rdmavt/mr.c')
-rw-r--r--drivers/infiniband/sw/rdmavt/mr.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/infiniband/sw/rdmavt/mr.c b/drivers/infiniband/sw/rdmavt/mr.c
index 728795043496..0bb6e39dd03a 100644
--- a/drivers/infiniband/sw/rdmavt/mr.c
+++ b/drivers/infiniband/sw/rdmavt/mr.c
@@ -608,11 +608,6 @@ static int rvt_set_page(struct ib_mr *ibmr, u64 addr)
608 if (unlikely(mapped_segs == mr->mr.max_segs)) 608 if (unlikely(mapped_segs == mr->mr.max_segs))
609 return -ENOMEM; 609 return -ENOMEM;
610 610
611 if (mr->mr.length == 0) {
612 mr->mr.user_base = addr;
613 mr->mr.iova = addr;
614 }
615
616 m = mapped_segs / RVT_SEGSZ; 611 m = mapped_segs / RVT_SEGSZ;
617 n = mapped_segs % RVT_SEGSZ; 612 n = mapped_segs % RVT_SEGSZ;
618 mr->mr.map[m]->segs[n].vaddr = (void *)addr; 613 mr->mr.map[m]->segs[n].vaddr = (void *)addr;
@@ -630,17 +625,24 @@ static int rvt_set_page(struct ib_mr *ibmr, u64 addr)
630 * @sg_nents: number of entries in sg 625 * @sg_nents: number of entries in sg
631 * @sg_offset: offset in bytes into sg 626 * @sg_offset: offset in bytes into sg
632 * 627 *
628 * Overwrite rvt_mr length with mr length calculated by ib_sg_to_pages.
629 *
633 * Return: number of sg elements mapped to the memory region 630 * Return: number of sg elements mapped to the memory region
634 */ 631 */
635int rvt_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, 632int rvt_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
636 int sg_nents, unsigned int *sg_offset) 633 int sg_nents, unsigned int *sg_offset)
637{ 634{
638 struct rvt_mr *mr = to_imr(ibmr); 635 struct rvt_mr *mr = to_imr(ibmr);
636 int ret;
639 637
640 mr->mr.length = 0; 638 mr->mr.length = 0;
641 mr->mr.page_shift = PAGE_SHIFT; 639 mr->mr.page_shift = PAGE_SHIFT;
642 return ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, 640 ret = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, rvt_set_page);
643 rvt_set_page); 641 mr->mr.user_base = ibmr->iova;
642 mr->mr.iova = ibmr->iova;
643 mr->mr.offset = ibmr->iova - (u64)mr->mr.map[0]->segs[0].vaddr;
644 mr->mr.length = (size_t)ibmr->length;
645 return ret;
644} 646}
645 647
646/** 648/**
@@ -671,6 +673,7 @@ int rvt_fast_reg_mr(struct rvt_qp *qp, struct ib_mr *ibmr, u32 key,
671 ibmr->rkey = key; 673 ibmr->rkey = key;
672 mr->mr.lkey = key; 674 mr->mr.lkey = key;
673 mr->mr.access_flags = access; 675 mr->mr.access_flags = access;
676 mr->mr.iova = ibmr->iova;
674 atomic_set(&mr->mr.lkey_invalid, 0); 677 atomic_set(&mr->mr.lkey_invalid, 0);
675 678
676 return 0; 679 return 0;