diff options
Diffstat (limited to 'drivers/infiniband/hw/amso1100/c2_provider.c')
-rw-r--r-- | drivers/infiniband/hw/amso1100/c2_provider.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/amso1100/c2_provider.c b/drivers/infiniband/hw/amso1100/c2_provider.c index 07eb3a8067d8..8af33cf1fc4e 100644 --- a/drivers/infiniband/hw/amso1100/c2_provider.c +++ b/drivers/infiniband/hw/amso1100/c2_provider.c | |||
@@ -431,9 +431,9 @@ static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
431 | u64 *pages; | 431 | u64 *pages; |
432 | u64 kva = 0; | 432 | u64 kva = 0; |
433 | int shift, n, len; | 433 | int shift, n, len; |
434 | int i, j, k; | 434 | int i, k, entry; |
435 | int err = 0; | 435 | int err = 0; |
436 | struct ib_umem_chunk *chunk; | 436 | struct scatterlist *sg; |
437 | struct c2_pd *c2pd = to_c2pd(pd); | 437 | struct c2_pd *c2pd = to_c2pd(pd); |
438 | struct c2_mr *c2mr; | 438 | struct c2_mr *c2mr; |
439 | 439 | ||
@@ -452,10 +452,7 @@ static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
452 | } | 452 | } |
453 | 453 | ||
454 | shift = ffs(c2mr->umem->page_size) - 1; | 454 | shift = ffs(c2mr->umem->page_size) - 1; |
455 | 455 | n = c2mr->umem->nmap; | |
456 | n = 0; | ||
457 | list_for_each_entry(chunk, &c2mr->umem->chunk_list, list) | ||
458 | n += chunk->nents; | ||
459 | 456 | ||
460 | pages = kmalloc(n * sizeof(u64), GFP_KERNEL); | 457 | pages = kmalloc(n * sizeof(u64), GFP_KERNEL); |
461 | if (!pages) { | 458 | if (!pages) { |
@@ -464,14 +461,12 @@ static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
464 | } | 461 | } |
465 | 462 | ||
466 | i = 0; | 463 | i = 0; |
467 | list_for_each_entry(chunk, &c2mr->umem->chunk_list, list) { | 464 | for_each_sg(c2mr->umem->sg_head.sgl, sg, c2mr->umem->nmap, entry) { |
468 | for (j = 0; j < chunk->nmap; ++j) { | 465 | len = sg_dma_len(sg) >> shift; |
469 | len = sg_dma_len(&chunk->page_list[j]) >> shift; | 466 | for (k = 0; k < len; ++k) { |
470 | for (k = 0; k < len; ++k) { | 467 | pages[i++] = |
471 | pages[i++] = | 468 | sg_dma_address(sg) + |
472 | sg_dma_address(&chunk->page_list[j]) + | 469 | (c2mr->umem->page_size * k); |
473 | (c2mr->umem->page_size * k); | ||
474 | } | ||
475 | } | 470 | } |
476 | } | 471 | } |
477 | 472 | ||