| .. | .. |
|---|
| 130 | 130 | |
|---|
| 131 | 131 | copy_len = len > C4IW_MAX_INLINE_SIZE ? C4IW_MAX_INLINE_SIZE : |
|---|
| 132 | 132 | len; |
|---|
| 133 | | - wr_len = roundup(sizeof *req + sizeof *sc + |
|---|
| 134 | | - roundup(copy_len, T4_ULPTX_MIN_IO), 16); |
|---|
| 133 | + wr_len = roundup(sizeof(*req) + sizeof(*sc) + |
|---|
| 134 | + roundup(copy_len, T4_ULPTX_MIN_IO), |
|---|
| 135 | + 16); |
|---|
| 135 | 136 | |
|---|
| 136 | 137 | if (!skb) { |
|---|
| 137 | 138 | skb = alloc_skb(wr_len, GFP_KERNEL | __GFP_NOFAIL); |
|---|
| .. | .. |
|---|
| 398 | 399 | mmid = stag >> 8; |
|---|
| 399 | 400 | mhp->ibmr.rkey = mhp->ibmr.lkey = stag; |
|---|
| 400 | 401 | mhp->ibmr.length = mhp->attr.len; |
|---|
| 401 | | - mhp->ibmr.iova = mhp->attr.va_fbo; |
|---|
| 402 | 402 | mhp->ibmr.page_size = 1U << (mhp->attr.page_size + 12); |
|---|
| 403 | 403 | pr_debug("mmid 0x%x mhp %p\n", mmid, mhp); |
|---|
| 404 | | - return insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid); |
|---|
| 404 | + return xa_insert_irq(&mhp->rhp->mrs, mmid, mhp, GFP_KERNEL); |
|---|
| 405 | 405 | } |
|---|
| 406 | 406 | |
|---|
| 407 | 407 | static int register_mem(struct c4iw_dev *rhp, struct c4iw_pd *php, |
|---|
| .. | .. |
|---|
| 508 | 508 | u64 virt, int acc, struct ib_udata *udata) |
|---|
| 509 | 509 | { |
|---|
| 510 | 510 | __be64 *pages; |
|---|
| 511 | | - int shift, n, len; |
|---|
| 512 | | - int i, k, entry; |
|---|
| 511 | + int shift, n, i; |
|---|
| 513 | 512 | int err = -ENOMEM; |
|---|
| 514 | | - struct scatterlist *sg; |
|---|
| 513 | + struct ib_block_iter biter; |
|---|
| 515 | 514 | struct c4iw_dev *rhp; |
|---|
| 516 | 515 | struct c4iw_pd *php; |
|---|
| 517 | 516 | struct c4iw_mr *mhp; |
|---|
| .. | .. |
|---|
| 543 | 542 | |
|---|
| 544 | 543 | mhp->rhp = rhp; |
|---|
| 545 | 544 | |
|---|
| 546 | | - mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc, 0); |
|---|
| 545 | + mhp->umem = ib_umem_get(pd->device, start, length, acc); |
|---|
| 547 | 546 | if (IS_ERR(mhp->umem)) |
|---|
| 548 | 547 | goto err_free_skb; |
|---|
| 549 | 548 | |
|---|
| 550 | | - shift = mhp->umem->page_shift; |
|---|
| 549 | + shift = PAGE_SHIFT; |
|---|
| 551 | 550 | |
|---|
| 552 | | - n = mhp->umem->nmap; |
|---|
| 551 | + n = ib_umem_num_dma_blocks(mhp->umem, 1 << shift); |
|---|
| 553 | 552 | err = alloc_pbl(mhp, n); |
|---|
| 554 | 553 | if (err) |
|---|
| 555 | 554 | goto err_umem_release; |
|---|
| .. | .. |
|---|
| 562 | 561 | |
|---|
| 563 | 562 | i = n = 0; |
|---|
| 564 | 563 | |
|---|
| 565 | | - for_each_sg(mhp->umem->sg_head.sgl, sg, mhp->umem->nmap, entry) { |
|---|
| 566 | | - len = sg_dma_len(sg) >> shift; |
|---|
| 567 | | - for (k = 0; k < len; ++k) { |
|---|
| 568 | | - pages[i++] = cpu_to_be64(sg_dma_address(sg) + |
|---|
| 569 | | - (k << shift)); |
|---|
| 570 | | - if (i == PAGE_SIZE / sizeof *pages) { |
|---|
| 571 | | - err = write_pbl(&mhp->rhp->rdev, |
|---|
| 572 | | - pages, |
|---|
| 573 | | - mhp->attr.pbl_addr + (n << 3), i, |
|---|
| 574 | | - mhp->wr_waitp); |
|---|
| 575 | | - if (err) |
|---|
| 576 | | - goto pbl_done; |
|---|
| 577 | | - n += i; |
|---|
| 578 | | - i = 0; |
|---|
| 579 | | - } |
|---|
| 564 | + rdma_umem_for_each_dma_block(mhp->umem, &biter, 1 << shift) { |
|---|
| 565 | + pages[i++] = cpu_to_be64(rdma_block_iter_dma_address(&biter)); |
|---|
| 566 | + if (i == PAGE_SIZE / sizeof(*pages)) { |
|---|
| 567 | + err = write_pbl(&mhp->rhp->rdev, pages, |
|---|
| 568 | + mhp->attr.pbl_addr + (n << 3), i, |
|---|
| 569 | + mhp->wr_waitp); |
|---|
| 570 | + if (err) |
|---|
| 571 | + goto pbl_done; |
|---|
| 572 | + n += i; |
|---|
| 573 | + i = 0; |
|---|
| 580 | 574 | } |
|---|
| 581 | 575 | } |
|---|
| 582 | 576 | |
|---|
| .. | .. |
|---|
| 617 | 611 | return ERR_PTR(err); |
|---|
| 618 | 612 | } |
|---|
| 619 | 613 | |
|---|
| 620 | | -struct ib_mw *c4iw_alloc_mw(struct ib_pd *pd, enum ib_mw_type type, |
|---|
| 621 | | - struct ib_udata *udata) |
|---|
| 614 | +int c4iw_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata) |
|---|
| 622 | 615 | { |
|---|
| 616 | + struct c4iw_mw *mhp = to_c4iw_mw(ibmw); |
|---|
| 623 | 617 | struct c4iw_dev *rhp; |
|---|
| 624 | 618 | struct c4iw_pd *php; |
|---|
| 625 | | - struct c4iw_mw *mhp; |
|---|
| 626 | 619 | u32 mmid; |
|---|
| 627 | 620 | u32 stag = 0; |
|---|
| 628 | 621 | int ret; |
|---|
| 629 | 622 | |
|---|
| 630 | | - if (type != IB_MW_TYPE_1) |
|---|
| 631 | | - return ERR_PTR(-EINVAL); |
|---|
| 623 | + if (ibmw->type != IB_MW_TYPE_1) |
|---|
| 624 | + return -EINVAL; |
|---|
| 632 | 625 | |
|---|
| 633 | | - php = to_c4iw_pd(pd); |
|---|
| 626 | + php = to_c4iw_pd(ibmw->pd); |
|---|
| 634 | 627 | rhp = php->rhp; |
|---|
| 635 | | - mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); |
|---|
| 636 | | - if (!mhp) |
|---|
| 637 | | - return ERR_PTR(-ENOMEM); |
|---|
| 638 | | - |
|---|
| 639 | 628 | mhp->wr_waitp = c4iw_alloc_wr_wait(GFP_KERNEL); |
|---|
| 640 | | - if (!mhp->wr_waitp) { |
|---|
| 641 | | - ret = -ENOMEM; |
|---|
| 642 | | - goto free_mhp; |
|---|
| 643 | | - } |
|---|
| 629 | + if (!mhp->wr_waitp) |
|---|
| 630 | + return -ENOMEM; |
|---|
| 644 | 631 | |
|---|
| 645 | 632 | mhp->dereg_skb = alloc_skb(SGE_MAX_WR_LEN, GFP_KERNEL); |
|---|
| 646 | 633 | if (!mhp->dereg_skb) { |
|---|
| .. | .. |
|---|
| 651 | 638 | ret = allocate_window(&rhp->rdev, &stag, php->pdid, mhp->wr_waitp); |
|---|
| 652 | 639 | if (ret) |
|---|
| 653 | 640 | goto free_skb; |
|---|
| 641 | + |
|---|
| 654 | 642 | mhp->rhp = rhp; |
|---|
| 655 | 643 | mhp->attr.pdid = php->pdid; |
|---|
| 656 | 644 | mhp->attr.type = FW_RI_STAG_MW; |
|---|
| 657 | 645 | mhp->attr.stag = stag; |
|---|
| 658 | 646 | mmid = (stag) >> 8; |
|---|
| 659 | | - mhp->ibmw.rkey = stag; |
|---|
| 660 | | - if (insert_handle(rhp, &rhp->mmidr, mhp, mmid)) { |
|---|
| 647 | + ibmw->rkey = stag; |
|---|
| 648 | + if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) { |
|---|
| 661 | 649 | ret = -ENOMEM; |
|---|
| 662 | 650 | goto dealloc_win; |
|---|
| 663 | 651 | } |
|---|
| 664 | 652 | pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid, mhp, stag); |
|---|
| 665 | | - return &(mhp->ibmw); |
|---|
| 653 | + return 0; |
|---|
| 666 | 654 | |
|---|
| 667 | 655 | dealloc_win: |
|---|
| 668 | 656 | deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb, |
|---|
| .. | .. |
|---|
| 671 | 659 | kfree_skb(mhp->dereg_skb); |
|---|
| 672 | 660 | free_wr_wait: |
|---|
| 673 | 661 | c4iw_put_wr_wait(mhp->wr_waitp); |
|---|
| 674 | | -free_mhp: |
|---|
| 675 | | - kfree(mhp); |
|---|
| 676 | | - return ERR_PTR(ret); |
|---|
| 662 | + return ret; |
|---|
| 677 | 663 | } |
|---|
| 678 | 664 | |
|---|
| 679 | 665 | int c4iw_dealloc_mw(struct ib_mw *mw) |
|---|
| .. | .. |
|---|
| 685 | 671 | mhp = to_c4iw_mw(mw); |
|---|
| 686 | 672 | rhp = mhp->rhp; |
|---|
| 687 | 673 | mmid = (mw->rkey) >> 8; |
|---|
| 688 | | - remove_handle(rhp, &rhp->mmidr, mmid); |
|---|
| 674 | + xa_erase_irq(&rhp->mrs, mmid); |
|---|
| 689 | 675 | deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb, |
|---|
| 690 | 676 | mhp->wr_waitp); |
|---|
| 691 | 677 | kfree_skb(mhp->dereg_skb); |
|---|
| 692 | 678 | c4iw_put_wr_wait(mhp->wr_waitp); |
|---|
| 693 | | - kfree(mhp); |
|---|
| 694 | | - pr_debug("ib_mw %p mmid 0x%x ptr %p\n", mw, mmid, mhp); |
|---|
| 695 | 679 | return 0; |
|---|
| 696 | 680 | } |
|---|
| 697 | 681 | |
|---|
| 698 | | -struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, |
|---|
| 699 | | - enum ib_mr_type mr_type, |
|---|
| 682 | +struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, |
|---|
| 700 | 683 | u32 max_num_sg) |
|---|
| 701 | 684 | { |
|---|
| 702 | 685 | struct c4iw_dev *rhp; |
|---|
| .. | .. |
|---|
| 752 | 735 | mhp->attr.state = 0; |
|---|
| 753 | 736 | mmid = (stag) >> 8; |
|---|
| 754 | 737 | mhp->ibmr.rkey = mhp->ibmr.lkey = stag; |
|---|
| 755 | | - if (insert_handle(rhp, &rhp->mmidr, mhp, mmid)) { |
|---|
| 738 | + if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) { |
|---|
| 756 | 739 | ret = -ENOMEM; |
|---|
| 757 | 740 | goto err_dereg; |
|---|
| 758 | 741 | } |
|---|
| .. | .. |
|---|
| 798 | 781 | return ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, c4iw_set_page); |
|---|
| 799 | 782 | } |
|---|
| 800 | 783 | |
|---|
| 801 | | -int c4iw_dereg_mr(struct ib_mr *ib_mr) |
|---|
| 784 | +int c4iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) |
|---|
| 802 | 785 | { |
|---|
| 803 | 786 | struct c4iw_dev *rhp; |
|---|
| 804 | 787 | struct c4iw_mr *mhp; |
|---|
| .. | .. |
|---|
| 809 | 792 | mhp = to_c4iw_mr(ib_mr); |
|---|
| 810 | 793 | rhp = mhp->rhp; |
|---|
| 811 | 794 | mmid = mhp->attr.stag >> 8; |
|---|
| 812 | | - remove_handle(rhp, &rhp->mmidr, mmid); |
|---|
| 795 | + xa_erase_irq(&rhp->mrs, mmid); |
|---|
| 813 | 796 | if (mhp->mpl) |
|---|
| 814 | 797 | dma_free_coherent(&mhp->rhp->rdev.lldi.pdev->dev, |
|---|
| 815 | 798 | mhp->max_mpl_len, mhp->mpl, mhp->mpl_addr); |
|---|
| .. | .. |
|---|
| 820 | 803 | mhp->attr.pbl_size << 3); |
|---|
| 821 | 804 | if (mhp->kva) |
|---|
| 822 | 805 | kfree((void *) (unsigned long) mhp->kva); |
|---|
| 823 | | - if (mhp->umem) |
|---|
| 824 | | - ib_umem_release(mhp->umem); |
|---|
| 806 | + ib_umem_release(mhp->umem); |
|---|
| 825 | 807 | pr_debug("mmid 0x%x ptr %p\n", mmid, mhp); |
|---|
| 826 | 808 | c4iw_put_wr_wait(mhp->wr_waitp); |
|---|
| 827 | 809 | kfree(mhp); |
|---|
| .. | .. |
|---|
| 833 | 815 | struct c4iw_mr *mhp; |
|---|
| 834 | 816 | unsigned long flags; |
|---|
| 835 | 817 | |
|---|
| 836 | | - spin_lock_irqsave(&rhp->lock, flags); |
|---|
| 837 | | - mhp = get_mhp(rhp, rkey >> 8); |
|---|
| 818 | + xa_lock_irqsave(&rhp->mrs, flags); |
|---|
| 819 | + mhp = xa_load(&rhp->mrs, rkey >> 8); |
|---|
| 838 | 820 | if (mhp) |
|---|
| 839 | 821 | mhp->attr.state = 0; |
|---|
| 840 | | - spin_unlock_irqrestore(&rhp->lock, flags); |
|---|
| 822 | + xa_unlock_irqrestore(&rhp->mrs, flags); |
|---|
| 841 | 823 | } |
|---|