Skip to content

Commit 63e56ae

Browse files
Wengang-oracleMukesh Kacker
authored andcommitted
rds_rdma: do not dealloc fmrs in the pool under use
In rds_ib_alloc_fmr, when it needs flush pools, it de-allocates FMRs. That is time-consuming and is not meaningful in functionality perspective. Fix is to not de-allocate the ones in the pool which is under use. Orabug: 21551548 Signed-off-by: Wengang Wang <[email protected]> Reviewed-by: Chien-Hua Yen <[email protected]>
1 parent 5de3861 commit 63e56ae

File tree

1 file changed

+37
-29
lines changed

1 file changed

+37
-29
lines changed

net/rds/ib_rdma.c

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -379,41 +379,49 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev,
379379
IB_ACCESS_REMOTE_ATOMIC),
380380
&pool->fmr_attr);
381381
if (IS_ERR(ibmr->fmr)) {
382+
int total_pool_size;
383+
int prev_8k_max;
384+
int prev_1m_max;
385+
382386
err = PTR_ERR(ibmr->fmr);
387+
ibmr->fmr = NULL;
388+
if (err != -ENOMEM)
389+
goto out_no_cigar;
383390

384391
/* Re-balance the pool sizes to reflect the memory resources
385392
* available to the VM.
386393
*/
387-
if (err == -ENOMEM) {
388-
int total_pool_size =
389-
atomic_read(&rds_ibdev->mr_8k_pool->item_count)
390-
* (RDS_FMR_8K_MSG_SIZE + 1) +
391-
atomic_read(&rds_ibdev->mr_1m_pool->item_count)
392-
* RDS_FMR_1M_MSG_SIZE;
393-
394-
if (total_pool_size) {
395-
int prev_8k_max = atomic_read(&rds_ibdev->mr_8k_pool->max_items_soft);
396-
int prev_1m_max = atomic_read(&rds_ibdev->mr_1m_pool->max_items_soft);
397-
atomic_set(&rds_ibdev->mr_8k_pool->max_items_soft, (total_pool_size / 4) / (RDS_FMR_8K_MSG_SIZE + 1));
398-
atomic_set(&rds_ibdev->mr_1m_pool->max_items_soft, (total_pool_size * 3 / 4) / RDS_FMR_1M_MSG_SIZE);
399-
printk(KERN_ERR "RDS/IB: "
400-
"Adjusted 8K FMR pool (%d->%d)\n",
401-
prev_8k_max,
402-
atomic_read(&rds_ibdev->mr_8k_pool->max_items_soft));
403-
printk(KERN_ERR "RDS/IB: "
404-
"Adjusted 1K FMR pool (%d->%d)\n",
405-
prev_1m_max,
406-
atomic_read(&rds_ibdev->mr_1m_pool->max_items_soft));
407-
rds_ib_flush_mr_pool(rds_ibdev->mr_8k_pool, 1,
408-
NULL);
409-
410-
rds_ib_flush_mr_pool(rds_ibdev->mr_1m_pool, 1,
411-
NULL);
412-
413-
err = -EAGAIN;
414-
}
394+
total_pool_size =
395+
atomic_read(&rds_ibdev->mr_8k_pool->item_count)
396+
* (RDS_FMR_8K_MSG_SIZE + 1) +
397+
atomic_read(&rds_ibdev->mr_1m_pool->item_count)
398+
* RDS_FMR_1M_MSG_SIZE;
399+
400+
if (!total_pool_size)
401+
goto out_no_cigar;
402+
403+
prev_8k_max = atomic_read(
404+
&rds_ibdev->mr_8k_pool->max_items_soft);
405+
prev_1m_max = atomic_read(
406+
&rds_ibdev->mr_1m_pool->max_items_soft);
407+
atomic_set(&rds_ibdev->mr_8k_pool->max_items_soft,
408+
(total_pool_size / 4) / (RDS_FMR_8K_MSG_SIZE + 1));
409+
atomic_set(&rds_ibdev->mr_1m_pool->max_items_soft,
410+
(total_pool_size * 3 / 4) / RDS_FMR_1M_MSG_SIZE);
411+
printk(KERN_ERR "RDS/IB: Adjusted 8K FMR pool (%d->%d)\n",
412+
prev_8k_max,
413+
atomic_read(&rds_ibdev->mr_8k_pool->max_items_soft));
414+
printk(KERN_ERR "RDS/IB: Adjusted 1M FMR pool (%d->%d)\n",
415+
prev_1m_max,
416+
atomic_read(&rds_ibdev->mr_1m_pool->max_items_soft));
417+
if (pool == rds_ibdev->mr_1m_pool) {
418+
rds_ib_flush_mr_pool(rds_ibdev->mr_1m_pool, 0, NULL);
419+
rds_ib_flush_mr_pool(rds_ibdev->mr_8k_pool, 1, NULL);
420+
} else {
421+
rds_ib_flush_mr_pool(rds_ibdev->mr_1m_pool, 1, NULL);
422+
rds_ib_flush_mr_pool(rds_ibdev->mr_8k_pool, 0, NULL);
415423
}
416-
ibmr->fmr = NULL;
424+
err = -EAGAIN;
417425
goto out_no_cigar;
418426
}
419427

0 commit comments

Comments
 (0)