summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Dreier <roland@eddore.topspincom.com>2005-08-15 14:35:16 (GMT)
committerRoland Dreier <rolandd@cisco.com>2005-08-27 03:37:36 (GMT)
commitffbf4c34f1916fa1e0554269c94c57da4a21a348 (patch)
tree1361f0ca29e0a8d4e22fb508b7493db441007c7f
parent2e8b981c5d5c6fe5479ad47c44e3e76ebb5408ef (diff)
downloadlinux-ffbf4c34f1916fa1e0554269c94c57da4a21a348.tar.xz
[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>
-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);