aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/fmr_pool.c
diff options
context:
space:
mode:
authorRoland Dreier <roland@eddore.topspincom.com>2005-08-15 07:35:16 -0700
committerRoland Dreier <rolandd@cisco.com>2005-08-26 20:37:36 -0700
commitffbf4c34f1916fa1e0554269c94c57da4a21a348 (patch)
tree1361f0ca29e0a8d4e22fb508b7493db441007c7f /drivers/infiniband/core/fmr_pool.c
parent2e8b981c5d5c6fe5479ad47c44e3e76ebb5408ef (diff)
downloadkernel_samsung_smdk4412-ffbf4c34f1916fa1e0554269c94c57da4a21a348.zip
kernel_samsung_smdk4412-ffbf4c34f1916fa1e0554269c94c57da4a21a348.tar.gz
kernel_samsung_smdk4412-ffbf4c34f1916fa1e0554269c94c57da4a21a348.tar.bz2
[PATCH] IB: unmap FMRs when destroying FMR pool
Make sure that all FMRs are unmapped before we deallocate them so that we don't leak references to our protection domain when destroying an FMR pool. (Bug reported by Guy German <guyg@voltaire.com>) Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/core/fmr_pool.c')
-rw-r--r--drivers/infiniband/core/fmr_pool.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c
index 7763b31..1f73749 100644
--- a/drivers/infiniband/core/fmr_pool.c
+++ b/drivers/infiniband/core/fmr_pool.c
@@ -334,6 +334,7 @@ void ib_destroy_fmr_pool(struct ib_fmr_pool *pool)
{
struct ib_pool_fmr *fmr;
struct ib_pool_fmr *tmp;
+ LIST_HEAD(fmr_list);
int i;
kthread_stop(pool->thread);
@@ -341,6 +342,11 @@ void ib_destroy_fmr_pool(struct ib_fmr_pool *pool)
i = 0;
list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) {
+ if (fmr->remap_count) {
+ INIT_LIST_HEAD(&fmr_list);
+ list_add_tail(&fmr->fmr->list, &fmr_list);
+ ib_unmap_fmr(&fmr_list);
+ }
ib_dealloc_fmr(fmr->fmr);
list_del(&fmr->list);
kfree(fmr);