]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rds: add busy_list only when fmr allocated successfully
authorWengang Wang <wen.gang.wang@oracle.com>
Mon, 7 Sep 2015 08:42:44 +0000 (16:42 +0800)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Thu, 17 Sep 2015 00:07:26 +0000 (17:07 -0700)
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 <wen.gang.wang@oracle.com>
Reviewed-by: Chien Yen <chien.yen@oracle.com>
Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
net/rds/ib_rdma.c

index ce4a7c8e4ef96bcf0c4f5cbcf7c9ee42e7eb9155..28c1b43dbad3cd5a99903c422b1c89a2a3afc966 100644 (file)
@@ -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);