diff options
-rw-r--r-- | net/rds/iw.c | 2 | ||||
-rw-r--r-- | net/rds/iw.h | 1 | ||||
-rw-r--r-- | net/rds/iw_rdma.c | 28 | ||||
-rw-r--r-- | net/rds/iw_send.c | 2 |
4 files changed, 11 insertions, 22 deletions
diff --git a/net/rds/iw.c b/net/rds/iw.c index d16e1cbc8e83..2e6b495502c1 100644 --- a/net/rds/iw.c +++ b/net/rds/iw.c | |||
@@ -83,8 +83,6 @@ void rds_iw_add_one(struct ib_device *device) | |||
83 | rds_iwdev->max_wrs = dev_attr->max_qp_wr; | 83 | rds_iwdev->max_wrs = dev_attr->max_qp_wr; |
84 | rds_iwdev->max_sge = min(dev_attr->max_sge, RDS_IW_MAX_SGE); | 84 | rds_iwdev->max_sge = min(dev_attr->max_sge, RDS_IW_MAX_SGE); |
85 | 85 | ||
86 | rds_iwdev->page_shift = max(PAGE_SHIFT, ffs(dev_attr->page_size_cap) - 1); | ||
87 | |||
88 | rds_iwdev->dev = device; | 86 | rds_iwdev->dev = device; |
89 | rds_iwdev->pd = ib_alloc_pd(device); | 87 | rds_iwdev->pd = ib_alloc_pd(device); |
90 | if (IS_ERR(rds_iwdev->pd)) | 88 | if (IS_ERR(rds_iwdev->pd)) |
diff --git a/net/rds/iw.h b/net/rds/iw.h index 0715dde323e7..dd72b62bd506 100644 --- a/net/rds/iw.h +++ b/net/rds/iw.h | |||
@@ -181,7 +181,6 @@ struct rds_iw_device { | |||
181 | struct ib_pd *pd; | 181 | struct ib_pd *pd; |
182 | struct ib_mr *mr; | 182 | struct ib_mr *mr; |
183 | struct rds_iw_mr_pool *mr_pool; | 183 | struct rds_iw_mr_pool *mr_pool; |
184 | int page_shift; | ||
185 | int max_sge; | 184 | int max_sge; |
186 | unsigned int max_wrs; | 185 | unsigned int max_wrs; |
187 | unsigned int dma_local_lkey:1; | 186 | unsigned int dma_local_lkey:1; |
diff --git a/net/rds/iw_rdma.c b/net/rds/iw_rdma.c index dcdb37da80f2..de4a1b16bf7b 100644 --- a/net/rds/iw_rdma.c +++ b/net/rds/iw_rdma.c | |||
@@ -263,18 +263,12 @@ static void rds_iw_set_scatterlist(struct rds_iw_scatterlist *sg, | |||
263 | } | 263 | } |
264 | 264 | ||
265 | static u64 *rds_iw_map_scatterlist(struct rds_iw_device *rds_iwdev, | 265 | static u64 *rds_iw_map_scatterlist(struct rds_iw_device *rds_iwdev, |
266 | struct rds_iw_scatterlist *sg, | 266 | struct rds_iw_scatterlist *sg) |
267 | unsigned int dma_page_shift) | ||
268 | { | 267 | { |
269 | struct ib_device *dev = rds_iwdev->dev; | 268 | struct ib_device *dev = rds_iwdev->dev; |
270 | u64 *dma_pages = NULL; | 269 | u64 *dma_pages = NULL; |
271 | u64 dma_mask; | ||
272 | unsigned int dma_page_size; | ||
273 | int i, j, ret; | 270 | int i, j, ret; |
274 | 271 | ||
275 | dma_page_size = 1 << dma_page_shift; | ||
276 | dma_mask = dma_page_size - 1; | ||
277 | |||
278 | WARN_ON(sg->dma_len); | 272 | WARN_ON(sg->dma_len); |
279 | 273 | ||
280 | sg->dma_len = ib_dma_map_sg(dev, sg->list, sg->len, DMA_BIDIRECTIONAL); | 274 | sg->dma_len = ib_dma_map_sg(dev, sg->list, sg->len, DMA_BIDIRECTIONAL); |
@@ -295,18 +289,18 @@ static u64 *rds_iw_map_scatterlist(struct rds_iw_device *rds_iwdev, | |||
295 | sg->bytes += dma_len; | 289 | sg->bytes += dma_len; |
296 | 290 | ||
297 | end_addr = dma_addr + dma_len; | 291 | end_addr = dma_addr + dma_len; |
298 | if (dma_addr & dma_mask) { | 292 | if (dma_addr & PAGE_MASK) { |
299 | if (i > 0) | 293 | if (i > 0) |
300 | goto out_unmap; | 294 | goto out_unmap; |
301 | dma_addr &= ~dma_mask; | 295 | dma_addr &= ~PAGE_MASK; |
302 | } | 296 | } |
303 | if (end_addr & dma_mask) { | 297 | if (end_addr & PAGE_MASK) { |
304 | if (i < sg->dma_len - 1) | 298 | if (i < sg->dma_len - 1) |
305 | goto out_unmap; | 299 | goto out_unmap; |
306 | end_addr = (end_addr + dma_mask) & ~dma_mask; | 300 | end_addr = (end_addr + PAGE_MASK) & ~PAGE_MASK; |
307 | } | 301 | } |
308 | 302 | ||
309 | sg->dma_npages += (end_addr - dma_addr) >> dma_page_shift; | 303 | sg->dma_npages += (end_addr - dma_addr) >> PAGE_SHIFT; |
310 | } | 304 | } |
311 | 305 | ||
312 | /* Now gather the dma addrs into one list */ | 306 | /* Now gather the dma addrs into one list */ |
@@ -325,8 +319,8 @@ static u64 *rds_iw_map_scatterlist(struct rds_iw_device *rds_iwdev, | |||
325 | u64 end_addr; | 319 | u64 end_addr; |
326 | 320 | ||
327 | end_addr = dma_addr + dma_len; | 321 | end_addr = dma_addr + dma_len; |
328 | dma_addr &= ~dma_mask; | 322 | dma_addr &= ~PAGE_MASK; |
329 | for (; dma_addr < end_addr; dma_addr += dma_page_size) | 323 | for (; dma_addr < end_addr; dma_addr += PAGE_SIZE) |
330 | dma_pages[j++] = dma_addr; | 324 | dma_pages[j++] = dma_addr; |
331 | BUG_ON(j > sg->dma_npages); | 325 | BUG_ON(j > sg->dma_npages); |
332 | } | 326 | } |
@@ -727,7 +721,7 @@ static int rds_iw_rdma_build_fastreg(struct rds_iw_mapping *mapping) | |||
727 | f_wr.wr.fast_reg.rkey = mapping->m_rkey; | 721 | f_wr.wr.fast_reg.rkey = mapping->m_rkey; |
728 | f_wr.wr.fast_reg.page_list = ibmr->page_list; | 722 | f_wr.wr.fast_reg.page_list = ibmr->page_list; |
729 | f_wr.wr.fast_reg.page_list_len = mapping->m_sg.dma_len; | 723 | f_wr.wr.fast_reg.page_list_len = mapping->m_sg.dma_len; |
730 | f_wr.wr.fast_reg.page_shift = ibmr->device->page_shift; | 724 | f_wr.wr.fast_reg.page_shift = PAGE_SHIFT; |
731 | f_wr.wr.fast_reg.access_flags = IB_ACCESS_LOCAL_WRITE | | 725 | f_wr.wr.fast_reg.access_flags = IB_ACCESS_LOCAL_WRITE | |
732 | IB_ACCESS_REMOTE_READ | | 726 | IB_ACCESS_REMOTE_READ | |
733 | IB_ACCESS_REMOTE_WRITE; | 727 | IB_ACCESS_REMOTE_WRITE; |
@@ -780,9 +774,7 @@ static int rds_iw_map_fastreg(struct rds_iw_mr_pool *pool, | |||
780 | 774 | ||
781 | rds_iw_set_scatterlist(&mapping->m_sg, sg, sg_len); | 775 | rds_iw_set_scatterlist(&mapping->m_sg, sg, sg_len); |
782 | 776 | ||
783 | dma_pages = rds_iw_map_scatterlist(rds_iwdev, | 777 | dma_pages = rds_iw_map_scatterlist(rds_iwdev, &mapping->m_sg); |
784 | &mapping->m_sg, | ||
785 | rds_iwdev->page_shift); | ||
786 | if (IS_ERR(dma_pages)) { | 778 | if (IS_ERR(dma_pages)) { |
787 | ret = PTR_ERR(dma_pages); | 779 | ret = PTR_ERR(dma_pages); |
788 | dma_pages = NULL; | 780 | dma_pages = NULL; |
diff --git a/net/rds/iw_send.c b/net/rds/iw_send.c index 44a6a0551f28..1f5abe3cf2b4 100644 --- a/net/rds/iw_send.c +++ b/net/rds/iw_send.c | |||
@@ -779,7 +779,7 @@ static void rds_iw_build_send_fastreg(struct rds_iw_device *rds_iwdev, struct rd | |||
779 | send->s_wr.wr.fast_reg.rkey = send->s_mr->rkey; | 779 | send->s_wr.wr.fast_reg.rkey = send->s_mr->rkey; |
780 | send->s_wr.wr.fast_reg.page_list = send->s_page_list; | 780 | send->s_wr.wr.fast_reg.page_list = send->s_page_list; |
781 | send->s_wr.wr.fast_reg.page_list_len = nent; | 781 | send->s_wr.wr.fast_reg.page_list_len = nent; |
782 | send->s_wr.wr.fast_reg.page_shift = rds_iwdev->page_shift; | 782 | send->s_wr.wr.fast_reg.page_shift = PAGE_SHIFT; |
783 | send->s_wr.wr.fast_reg.access_flags = IB_ACCESS_REMOTE_WRITE; | 783 | send->s_wr.wr.fast_reg.access_flags = IB_ACCESS_REMOTE_WRITE; |
784 | send->s_wr.wr.fast_reg.iova_start = sg_addr; | 784 | send->s_wr.wr.fast_reg.iova_start = sg_addr; |
785 | 785 | ||