diff options
author | Santosh Shilimkar <santosh.shilimkar@oracle.com> | 2016-03-08 09:19:01 -0800 |
---|---|---|
committer | Santosh Shilimkar <santosh.shilimkar@oracle.com> | 2017-01-02 14:02:47 -0800 |
commit | 56012459310a1dbcc55c2dbf5500a9f7571402cb (patch) | |
tree | 38c3280346b68541e459497342a0246998a9089f /net/rds/ib_frmr.c | |
parent | 584a8279a44a800dea5a5c1e9d53a002e03016b4 (diff) | |
download | op-kernel-dev-56012459310a1dbcc55c2dbf5500a9f7571402cb.zip op-kernel-dev-56012459310a1dbcc55c2dbf5500a9f7571402cb.tar.gz |
RDS: IB: split the mr registration and invalidation path
MR invalidation in RDS is done in background thread and not in
data path like registration. So break the dependency between them
which helps to remove the performance bottleneck.
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Diffstat (limited to 'net/rds/ib_frmr.c')
-rw-r--r-- | net/rds/ib_frmr.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/net/rds/ib_frmr.c b/net/rds/ib_frmr.c index 66b3d62..48332a6 100644 --- a/net/rds/ib_frmr.c +++ b/net/rds/ib_frmr.c @@ -241,8 +241,8 @@ static int rds_ib_post_inv(struct rds_ib_mr *ibmr) if (frmr->fr_state != FRMR_IS_INUSE) goto out; - while (atomic_dec_return(&ibmr->ic->i_fastreg_wrs) <= 0) { - atomic_inc(&ibmr->ic->i_fastreg_wrs); + while (atomic_dec_return(&ibmr->ic->i_fastunreg_wrs) <= 0) { + atomic_inc(&ibmr->ic->i_fastunreg_wrs); cpu_relax(); } @@ -261,7 +261,7 @@ static int rds_ib_post_inv(struct rds_ib_mr *ibmr) if (unlikely(ret)) { frmr->fr_state = FRMR_IS_STALE; frmr->fr_inv = false; - atomic_inc(&ibmr->ic->i_fastreg_wrs); + atomic_inc(&ibmr->ic->i_fastunreg_wrs); pr_err("RDS/IB: %s returned error(%d)\n", __func__, ret); goto out; } @@ -289,9 +289,10 @@ void rds_ib_mr_cqe_handler(struct rds_ib_connection *ic, struct ib_wc *wc) if (frmr->fr_inv) { frmr->fr_state = FRMR_IS_FREE; frmr->fr_inv = false; + atomic_inc(&ic->i_fastreg_wrs); + } else { + atomic_inc(&ic->i_fastunreg_wrs); } - - atomic_inc(&ic->i_fastreg_wrs); } void rds_ib_unreg_frmr(struct list_head *list, unsigned int *nfreed, |