From 5660542fb74b493cb469ec8c27fb6927e01f2934 Mon Sep 17 00:00:00 2001 From: Wengang Wang Date: Tue, 4 Aug 2015 16:27:08 +0800 Subject: [PATCH] rds_rdma: allocate FMR according to max_item_soft When max_item on the pool is very large(say 170000), large number of alloc_fmr request would fail with -EGAIN. This can greatly hurt performance. Actually, whether it is going to allocate or wait for pool flush should be according to "max_item_soft" rather than "max_item" because we are resizing the pool by changing "max_item_soft" not max_item. Also, when successfully allocated a lower layer fmr, we should increase "max_item_soft" incrementally, not set it immediately to "max_item". Orabug: 21551548 Signed-off-by: Wengang Wang Reviewed-by: Chien-Hua Yen --- net/rds/ib_rdma.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c index d31700f4d1bad..03cb6c91aa154 100644 --- a/net/rds/ib_rdma.c +++ b/net/rds/ib_rdma.c @@ -341,7 +341,8 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev, * We're fussy with enforcing the FMR limit, though. If the driver * tells us we can't use more than N fmrs, we shouldn't start * arguing with it */ - if (atomic_inc_return(&pool->item_count) <= pool->max_items) + if (atomic_inc_return(&pool->item_count) <= + atomic_read(&pool->max_items_soft)) break; atomic_dec(&pool->item_count); @@ -431,9 +432,8 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev, else rds_ib_stats_inc(s_ib_rdma_mr_1m_alloc); - if (atomic_read(&pool->item_count) > - atomic_read(&pool->max_items_soft)) - atomic_set(&pool->max_items_soft, pool->max_items); + if (atomic_read(&pool->item_count) > atomic_read(&pool->max_items_soft)) + atomic_inc(&pool->max_items_soft); return ibmr; -- 2.50.1