diff options
Diffstat (limited to 'drivers/infiniband/sw/rdmavt/mr.c')
-rw-r--r-- | drivers/infiniband/sw/rdmavt/mr.c | 17 |
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 | */ |
635 | int rvt_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, | 632 | int 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; |