.. | .. |
---|
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 | } |
---|