From f48c42377be932a6c2a60eb111e2e0f154f33d8c Mon Sep 17 00:00:00 2001 From: Wengang Wang Date: Mon, 7 Sep 2015 16:42:44 +0800 Subject: [PATCH] rds: add busy_list only when fmr allocated successfully The rdma layer ibmr is always added to busy list of the pool after memory is allocated. In case the lower layer fmr allocation fails, it should be removed from the busy list before memoryis freed but it wasn't. Thus the freed ibmr is left in busy list, and the busy list gets into unstable state. Fix is to add busy_list only when fmr is allocated successfully Orabug: 21795840 Signed-off-by: Wengang Wang Reviewed-by: Chien Yen Signed-off-by: Mukesh Kacker --- net/rds/ib_rdma.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c index ce4a7c8e4ef96..28c1b43dbad3c 100644 --- a/net/rds/ib_rdma.c +++ b/net/rds/ib_rdma.c @@ -409,13 +409,6 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev, goto out_no_cigar; } - memset(ibmr, 0, sizeof(*ibmr)); - - INIT_LIST_HEAD(&ibmr->pool_list); - spin_lock(&pool->busy_lock); - list_add(&ibmr->pool_list, &pool->busy_list); - spin_unlock(&pool->busy_lock); - ibmr->fmr = ib_alloc_fmr(rds_ibdev->pd, (IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_READ | @@ -469,6 +462,11 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev, goto out_no_cigar; } + INIT_LIST_HEAD(&ibmr->pool_list); + spin_lock(&pool->busy_lock); + list_add(&ibmr->pool_list, &pool->busy_list); + spin_unlock(&pool->busy_lock); + ibmr->pool = pool; if (pool->pool_type == RDS_IB_MR_8K_POOL) rds_ib_stats_inc(s_ib_rdma_mr_8k_alloc); -- 2.49.0