mem.c (0ea8a56de21be24cb79abb03dee79aabcd60a316) | mem.c (d18bb3e15201918b8d07e85a6e010ca5ed28dad5) |
---|---|
1/* 2 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 496 unchanged lines hidden (view full) --- 505} 506 507struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, 508 u64 virt, int acc, struct ib_udata *udata) 509{ 510 __be64 *pages; 511 int shift, n, i; 512 int err = -ENOMEM; | 1/* 2 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 496 unchanged lines hidden (view full) --- 505} 506 507struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, 508 u64 virt, int acc, struct ib_udata *udata) 509{ 510 __be64 *pages; 511 int shift, n, i; 512 int err = -ENOMEM; |
513 struct sg_dma_page_iter sg_iter; | 513 struct ib_block_iter biter; |
514 struct c4iw_dev *rhp; 515 struct c4iw_pd *php; 516 struct c4iw_mr *mhp; 517 518 pr_debug("ib_pd %p\n", pd); 519 520 if (length == ~0ULL) 521 return ERR_PTR(-EINVAL); --- 21 unchanged lines hidden (view full) --- 543 mhp->rhp = rhp; 544 545 mhp->umem = ib_umem_get(pd->device, start, length, acc); 546 if (IS_ERR(mhp->umem)) 547 goto err_free_skb; 548 549 shift = PAGE_SHIFT; 550 | 514 struct c4iw_dev *rhp; 515 struct c4iw_pd *php; 516 struct c4iw_mr *mhp; 517 518 pr_debug("ib_pd %p\n", pd); 519 520 if (length == ~0ULL) 521 return ERR_PTR(-EINVAL); --- 21 unchanged lines hidden (view full) --- 543 mhp->rhp = rhp; 544 545 mhp->umem = ib_umem_get(pd->device, start, length, acc); 546 if (IS_ERR(mhp->umem)) 547 goto err_free_skb; 548 549 shift = PAGE_SHIFT; 550 |
551 n = ib_umem_num_pages(mhp->umem); | 551 n = ib_umem_num_dma_blocks(mhp->umem, 1 << shift); |
552 err = alloc_pbl(mhp, n); 553 if (err) 554 goto err_umem_release; 555 556 pages = (__be64 *) __get_free_page(GFP_KERNEL); 557 if (!pages) { 558 err = -ENOMEM; 559 goto err_pbl_free; 560 } 561 562 i = n = 0; 563 | 552 err = alloc_pbl(mhp, n); 553 if (err) 554 goto err_umem_release; 555 556 pages = (__be64 *) __get_free_page(GFP_KERNEL); 557 if (!pages) { 558 err = -ENOMEM; 559 goto err_pbl_free; 560 } 561 562 i = n = 0; 563 |
564 for_each_sg_dma_page(mhp->umem->sg_head.sgl, &sg_iter, mhp->umem->nmap, 0) { 565 pages[i++] = cpu_to_be64(sg_page_iter_dma_address(&sg_iter)); | 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; --- 32 unchanged lines hidden (view full) --- 606 kfree_skb(mhp->dereg_skb); 607err_free_wr_wait: 608 c4iw_put_wr_wait(mhp->wr_waitp); 609err_free_mhp: 610 kfree(mhp); 611 return ERR_PTR(err); 612} 613 | 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; --- 32 unchanged lines hidden (view full) --- 606 kfree_skb(mhp->dereg_skb); 607err_free_wr_wait: 608 c4iw_put_wr_wait(mhp->wr_waitp); 609err_free_mhp: 610 kfree(mhp); 611 return ERR_PTR(err); 612} 613 |
614struct ib_mw *c4iw_alloc_mw(struct ib_pd *pd, enum ib_mw_type type, 615 struct ib_udata *udata) | 614int c4iw_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata) |
616{ | 615{ |
616 struct c4iw_mw *mhp = to_c4iw_mw(ibmw); |
|
617 struct c4iw_dev *rhp; 618 struct c4iw_pd *php; | 617 struct c4iw_dev *rhp; 618 struct c4iw_pd *php; |
619 struct c4iw_mw *mhp; | |
620 u32 mmid; 621 u32 stag = 0; 622 int ret; 623 | 619 u32 mmid; 620 u32 stag = 0; 621 int ret; 622 |
624 if (type != IB_MW_TYPE_1) 625 return ERR_PTR(-EINVAL); | 623 if (ibmw->type != IB_MW_TYPE_1) 624 return -EINVAL; |
626 | 625 |
627 php = to_c4iw_pd(pd); | 626 php = to_c4iw_pd(ibmw->pd); |
628 rhp = php->rhp; | 627 rhp = php->rhp; |
629 mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); 630 if (!mhp) 631 return ERR_PTR(-ENOMEM); 632 | |
633 mhp->wr_waitp = c4iw_alloc_wr_wait(GFP_KERNEL); | 628 mhp->wr_waitp = c4iw_alloc_wr_wait(GFP_KERNEL); |
634 if (!mhp->wr_waitp) { 635 ret = -ENOMEM; 636 goto free_mhp; 637 } | 629 if (!mhp->wr_waitp) 630 return -ENOMEM; |
638 639 mhp->dereg_skb = alloc_skb(SGE_MAX_WR_LEN, GFP_KERNEL); 640 if (!mhp->dereg_skb) { 641 ret = -ENOMEM; 642 goto free_wr_wait; 643 } 644 645 ret = allocate_window(&rhp->rdev, &stag, php->pdid, mhp->wr_waitp); 646 if (ret) 647 goto free_skb; | 631 632 mhp->dereg_skb = alloc_skb(SGE_MAX_WR_LEN, GFP_KERNEL); 633 if (!mhp->dereg_skb) { 634 ret = -ENOMEM; 635 goto free_wr_wait; 636 } 637 638 ret = allocate_window(&rhp->rdev, &stag, php->pdid, mhp->wr_waitp); 639 if (ret) 640 goto free_skb; |
641 |
|
648 mhp->rhp = rhp; 649 mhp->attr.pdid = php->pdid; 650 mhp->attr.type = FW_RI_STAG_MW; 651 mhp->attr.stag = stag; 652 mmid = (stag) >> 8; | 642 mhp->rhp = rhp; 643 mhp->attr.pdid = php->pdid; 644 mhp->attr.type = FW_RI_STAG_MW; 645 mhp->attr.stag = stag; 646 mmid = (stag) >> 8; |
653 mhp->ibmw.rkey = stag; | 647 ibmw->rkey = stag; |
654 if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) { 655 ret = -ENOMEM; 656 goto dealloc_win; 657 } 658 pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid, mhp, stag); | 648 if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) { 649 ret = -ENOMEM; 650 goto dealloc_win; 651 } 652 pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid, mhp, stag); |
659 return &(mhp->ibmw); | 653 return 0; |
660 661dealloc_win: 662 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb, 663 mhp->wr_waitp); 664free_skb: 665 kfree_skb(mhp->dereg_skb); 666free_wr_wait: 667 c4iw_put_wr_wait(mhp->wr_waitp); | 654 655dealloc_win: 656 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb, 657 mhp->wr_waitp); 658free_skb: 659 kfree_skb(mhp->dereg_skb); 660free_wr_wait: 661 c4iw_put_wr_wait(mhp->wr_waitp); |
668free_mhp: 669 kfree(mhp); 670 return ERR_PTR(ret); | 662 return ret; |
671} 672 673int c4iw_dealloc_mw(struct ib_mw *mw) 674{ 675 struct c4iw_dev *rhp; 676 struct c4iw_mw *mhp; 677 u32 mmid; 678 679 mhp = to_c4iw_mw(mw); 680 rhp = mhp->rhp; 681 mmid = (mw->rkey) >> 8; 682 xa_erase_irq(&rhp->mrs, mmid); 683 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb, 684 mhp->wr_waitp); 685 kfree_skb(mhp->dereg_skb); 686 c4iw_put_wr_wait(mhp->wr_waitp); | 663} 664 665int c4iw_dealloc_mw(struct ib_mw *mw) 666{ 667 struct c4iw_dev *rhp; 668 struct c4iw_mw *mhp; 669 u32 mmid; 670 671 mhp = to_c4iw_mw(mw); 672 rhp = mhp->rhp; 673 mmid = (mw->rkey) >> 8; 674 xa_erase_irq(&rhp->mrs, mmid); 675 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb, 676 mhp->wr_waitp); 677 kfree_skb(mhp->dereg_skb); 678 c4iw_put_wr_wait(mhp->wr_waitp); |
687 pr_debug("ib_mw %p mmid 0x%x ptr %p\n", mw, mmid, mhp); 688 kfree(mhp); | |
689 return 0; 690} 691 692struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, 693 u32 max_num_sg) 694{ 695 struct c4iw_dev *rhp; 696 struct c4iw_pd *php; --- 137 unchanged lines hidden --- | 679 return 0; 680} 681 682struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, 683 u32 max_num_sg) 684{ 685 struct c4iw_dev *rhp; 686 struct c4iw_pd *php; --- 137 unchanged lines hidden --- |