@@ -379,41 +379,49 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev,
379
379
IB_ACCESS_REMOTE_ATOMIC ),
380
380
& pool -> fmr_attr );
381
381
if (IS_ERR (ibmr -> fmr )) {
382
+ int total_pool_size ;
383
+ int prev_8k_max ;
384
+ int prev_1m_max ;
385
+
382
386
err = PTR_ERR (ibmr -> fmr );
387
+ ibmr -> fmr = NULL ;
388
+ if (err != - ENOMEM )
389
+ goto out_no_cigar ;
383
390
384
391
/* Re-balance the pool sizes to reflect the memory resources
385
392
* available to the VM.
386
393
*/
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 );
415
423
}
416
- ibmr -> fmr = NULL ;
424
+ err = - EAGAIN ;
417
425
goto out_no_cigar ;
418
426
}
419
427
0 commit comments