diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-03-13 15:01:58 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-03-13 15:01:58 -0400 |
commit | 5aad2145ac42a12ae8bf8383d2e0319c172d99a7 (patch) | |
tree | 2c4a38a9e13222aed73b14c05c159955a88c6b1f /drivers/infiniband/hw/cxgb4 | |
parent | fa389e220254c69ffae0d403eac4146171062d08 (diff) | |
parent | 2dea909444c294f55316c068906945ef38980ef3 (diff) |
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband into for-next
Diffstat (limited to 'drivers/infiniband/hw/cxgb4')
-rw-r--r-- | drivers/infiniband/hw/cxgb4/mem.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c index 41b11951a30a..392d422b00cb 100644 --- a/drivers/infiniband/hw/cxgb4/mem.c +++ b/drivers/infiniband/hw/cxgb4/mem.c | |||
@@ -678,9 +678,9 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
678 | { | 678 | { |
679 | __be64 *pages; | 679 | __be64 *pages; |
680 | int shift, n, len; | 680 | int shift, n, len; |
681 | int i, j, k; | 681 | int i, k, entry; |
682 | int err = 0; | 682 | int err = 0; |
683 | struct ib_umem_chunk *chunk; | 683 | struct scatterlist *sg; |
684 | struct c4iw_dev *rhp; | 684 | struct c4iw_dev *rhp; |
685 | struct c4iw_pd *php; | 685 | struct c4iw_pd *php; |
686 | struct c4iw_mr *mhp; | 686 | struct c4iw_mr *mhp; |
@@ -710,10 +710,7 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
710 | 710 | ||
711 | shift = ffs(mhp->umem->page_size) - 1; | 711 | shift = ffs(mhp->umem->page_size) - 1; |
712 | 712 | ||
713 | n = 0; | 713 | n = mhp->umem->nmap; |
714 | list_for_each_entry(chunk, &mhp->umem->chunk_list, list) | ||
715 | n += chunk->nents; | ||
716 | |||
717 | err = alloc_pbl(mhp, n); | 714 | err = alloc_pbl(mhp, n); |
718 | if (err) | 715 | if (err) |
719 | goto err; | 716 | goto err; |
@@ -726,24 +723,22 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
726 | 723 | ||
727 | i = n = 0; | 724 | i = n = 0; |
728 | 725 | ||
729 | list_for_each_entry(chunk, &mhp->umem->chunk_list, list) | 726 | for_each_sg(mhp->umem->sg_head.sgl, sg, mhp->umem->nmap, entry) { |
730 | for (j = 0; j < chunk->nmap; ++j) { | 727 | len = sg_dma_len(sg) >> shift; |
731 | len = sg_dma_len(&chunk->page_list[j]) >> shift; | 728 | for (k = 0; k < len; ++k) { |
732 | for (k = 0; k < len; ++k) { | 729 | pages[i++] = cpu_to_be64(sg_dma_address(sg) + |
733 | pages[i++] = cpu_to_be64(sg_dma_address( | 730 | mhp->umem->page_size * k); |
734 | &chunk->page_list[j]) + | 731 | if (i == PAGE_SIZE / sizeof *pages) { |
735 | mhp->umem->page_size * k); | 732 | err = write_pbl(&mhp->rhp->rdev, |
736 | if (i == PAGE_SIZE / sizeof *pages) { | 733 | pages, |
737 | err = write_pbl(&mhp->rhp->rdev, | 734 | mhp->attr.pbl_addr + (n << 3), i); |
738 | pages, | 735 | if (err) |
739 | mhp->attr.pbl_addr + (n << 3), i); | 736 | goto pbl_done; |
740 | if (err) | 737 | n += i; |
741 | goto pbl_done; | 738 | i = 0; |
742 | n += i; | ||
743 | i = 0; | ||
744 | } | ||
745 | } | 739 | } |
746 | } | 740 | } |
741 | } | ||
747 | 742 | ||
748 | if (i) | 743 | if (i) |
749 | err = write_pbl(&mhp->rhp->rdev, pages, | 744 | err = write_pbl(&mhp->rhp->rdev, pages, |