aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds/ib_rdma.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2010-07-19 20:06:46 -0400
committerAndy Grover <andy.grover@oracle.com>2010-09-08 21:16:42 -0400
commit8576f374ac9537674e3cccb0a9d43fa2b7ebbf5b (patch)
treeed7279333989d204a6627b703ae568ba0136a4b1 /net/rds/ib_rdma.c
parentb4e1da3c9a0ac9b01f45a8578b7347e3a31f9fb8 (diff)
RDS: flush fmrs before allocating new ones
Flushing FMRs is somewhat expensive, and is currently kicked off when the interrupt handler notices that we are getting low. The result of this is that FMR flushing only happens from the interrupt cpus. This spreads the load more effectively by triggering flushes just before we allocate a new FMR. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'net/rds/ib_rdma.c')
-rw-r--r--net/rds/ib_rdma.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c
index 3efdddc39d49..0017964f2fcf 100644
--- a/net/rds/ib_rdma.c
+++ b/net/rds/ib_rdma.c
@@ -38,6 +38,8 @@
38#include "ib.h" 38#include "ib.h"
39#include "xlist.h" 39#include "xlist.h"
40 40
41struct workqueue_struct *rds_ib_fmr_wq;
42
41static DEFINE_PER_CPU(unsigned long, clean_list_grace); 43static DEFINE_PER_CPU(unsigned long, clean_list_grace);
42#define CLEAN_LIST_BUSY_BIT 0 44#define CLEAN_LIST_BUSY_BIT 0
43 45
@@ -304,6 +306,9 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev)
304 struct rds_ib_mr *ibmr = NULL; 306 struct rds_ib_mr *ibmr = NULL;
305 int err = 0, iter = 0; 307 int err = 0, iter = 0;
306 308
309 if (atomic_read(&pool->dirty_count) >= pool->max_items / 10)
310 queue_delayed_work(rds_ib_fmr_wq, &pool->flush_worker, 10);
311
307 while (1) { 312 while (1) {
308 ibmr = rds_ib_reuse_fmr(pool); 313 ibmr = rds_ib_reuse_fmr(pool);
309 if (ibmr) 314 if (ibmr)
@@ -691,8 +696,6 @@ out_nolock:
691 return ret; 696 return ret;
692} 697}
693 698
694struct workqueue_struct *rds_ib_fmr_wq;
695
696int rds_ib_fmr_init(void) 699int rds_ib_fmr_init(void)
697{ 700{
698 rds_ib_fmr_wq = create_workqueue("rds_fmr_flushd"); 701 rds_ib_fmr_wq = create_workqueue("rds_fmr_flushd");