diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/mem.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb4/mem.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c index 40c835309e49..57e07c61ace2 100644 --- a/drivers/infiniband/hw/cxgb4/mem.c +++ b/drivers/infiniband/hw/cxgb4/mem.c | |||
@@ -131,10 +131,14 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, | |||
131 | stag_idx = (*stag) >> 8; | 131 | stag_idx = (*stag) >> 8; |
132 | 132 | ||
133 | if ((!reset_tpt_entry) && (*stag == T4_STAG_UNSET)) { | 133 | if ((!reset_tpt_entry) && (*stag == T4_STAG_UNSET)) { |
134 | stag_idx = c4iw_get_resource(&rdev->resource.tpt_fifo, | 134 | stag_idx = c4iw_get_resource(&rdev->resource.tpt_table); |
135 | &rdev->resource.tpt_fifo_lock); | ||
136 | if (!stag_idx) | 135 | if (!stag_idx) |
137 | return -ENOMEM; | 136 | return -ENOMEM; |
137 | mutex_lock(&rdev->stats.lock); | ||
138 | rdev->stats.stag.cur += 32; | ||
139 | if (rdev->stats.stag.cur > rdev->stats.stag.max) | ||
140 | rdev->stats.stag.max = rdev->stats.stag.cur; | ||
141 | mutex_unlock(&rdev->stats.lock); | ||
138 | *stag = (stag_idx << 8) | (atomic_inc_return(&key) & 0xff); | 142 | *stag = (stag_idx << 8) | (atomic_inc_return(&key) & 0xff); |
139 | } | 143 | } |
140 | PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n", | 144 | PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n", |
@@ -165,9 +169,12 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, | |||
165 | (rdev->lldi.vr->stag.start >> 5), | 169 | (rdev->lldi.vr->stag.start >> 5), |
166 | sizeof(tpt), &tpt); | 170 | sizeof(tpt), &tpt); |
167 | 171 | ||
168 | if (reset_tpt_entry) | 172 | if (reset_tpt_entry) { |
169 | c4iw_put_resource(&rdev->resource.tpt_fifo, stag_idx, | 173 | c4iw_put_resource(&rdev->resource.tpt_table, stag_idx); |
170 | &rdev->resource.tpt_fifo_lock); | 174 | mutex_lock(&rdev->stats.lock); |
175 | rdev->stats.stag.cur -= 32; | ||
176 | mutex_unlock(&rdev->stats.lock); | ||
177 | } | ||
171 | return err; | 178 | return err; |
172 | } | 179 | } |
173 | 180 | ||
@@ -686,8 +693,8 @@ int c4iw_dealloc_mw(struct ib_mw *mw) | |||
686 | mhp = to_c4iw_mw(mw); | 693 | mhp = to_c4iw_mw(mw); |
687 | rhp = mhp->rhp; | 694 | rhp = mhp->rhp; |
688 | mmid = (mw->rkey) >> 8; | 695 | mmid = (mw->rkey) >> 8; |
689 | deallocate_window(&rhp->rdev, mhp->attr.stag); | ||
690 | remove_handle(rhp, &rhp->mmidr, mmid); | 696 | remove_handle(rhp, &rhp->mmidr, mmid); |
697 | deallocate_window(&rhp->rdev, mhp->attr.stag); | ||
691 | kfree(mhp); | 698 | kfree(mhp); |
692 | PDBG("%s ib_mw %p mmid 0x%x ptr %p\n", __func__, mw, mmid, mhp); | 699 | PDBG("%s ib_mw %p mmid 0x%x ptr %p\n", __func__, mw, mmid, mhp); |
693 | return 0; | 700 | return 0; |
@@ -789,12 +796,12 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr) | |||
789 | mhp = to_c4iw_mr(ib_mr); | 796 | mhp = to_c4iw_mr(ib_mr); |
790 | rhp = mhp->rhp; | 797 | rhp = mhp->rhp; |
791 | mmid = mhp->attr.stag >> 8; | 798 | mmid = mhp->attr.stag >> 8; |
799 | remove_handle(rhp, &rhp->mmidr, mmid); | ||
792 | dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, | 800 | dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, |
793 | mhp->attr.pbl_addr); | 801 | mhp->attr.pbl_addr); |
794 | if (mhp->attr.pbl_size) | 802 | if (mhp->attr.pbl_size) |
795 | c4iw_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr, | 803 | c4iw_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr, |
796 | mhp->attr.pbl_size << 3); | 804 | mhp->attr.pbl_size << 3); |
797 | remove_handle(rhp, &rhp->mmidr, mmid); | ||
798 | if (mhp->kva) | 805 | if (mhp->kva) |
799 | kfree((void *) (unsigned long) mhp->kva); | 806 | kfree((void *) (unsigned long) mhp->kva); |
800 | if (mhp->umem) | 807 | if (mhp->umem) |