This reverts commit 
56012459310a1dbcc55c2dbf5500a9f7571402cb.
RDS kept spinning inside function "rds_ib_post_reg_frmr", waiting for
"i_fastreg_wrs" to become incremented:
         while (atomic_dec_return(&ibmr->ic->i_fastreg_wrs) <= 0) {
                 atomic_inc(&ibmr->ic->i_fastreg_wrs);
                 cpu_relax();
         }
Looking at the original commit:
commit 
56012459310a ("RDS: IB: split the mr registration and
invalidation path")
In there, the "rds_ib_mr_cqe_handler" was changed in the following
way:
 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);
        }
It looks like it's got it exactly backwards:
Function "rds_ib_post_reg_frmr" keeps track of the outstanding
requests via "i_fastreg_wrs".
Function "rds_ib_post_inv" keeps track of the outstanding requests
via "i_fastunreg_wrs" (post original commit). It also sets:
         frmr->fr_inv = true;
However the completion handler "rds_ib_mr_cqe_handler" adjusts
"i_fastreg_wrs" when "fr_inv" had been true, and adjusts
"i_fastunreg_wrs" otherwise.
The original commit was done in the name of performance:
to remove the performance bottleneck
No performance benefit could be observed with a fixed-up version
of the original commit measured between two Oracle X7 servers,
both equipped with Mellanox Connect-X5 HCAs.
The prudent course of action is to revert this commit.
Signed-off-by: Gerd Rausch <gerd.rausch@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
 
 
 #define RDS_IB_DEFAULT_RECV_WR         1024
 #define RDS_IB_DEFAULT_SEND_WR         256
-#define RDS_IB_DEFAULT_FR_WR           256
-#define RDS_IB_DEFAULT_FR_INV_WR       256
+#define RDS_IB_DEFAULT_FR_WR           512
 
 #define RDS_IB_DEFAULT_RETRY_COUNT     1
 
 
        /* To control the number of wrs from fastreg */
        atomic_t                i_fastreg_wrs;
-       atomic_t                i_fastunreg_wrs;
 
        /* interrupt handling */
        struct tasklet_struct   i_send_tasklet;
 
         * completion queue and send queue. This extra space is used for FRMR
         * registration and invalidation work requests
         */
-       fr_queue_space = rds_ibdev->use_fastreg ?
-                        (RDS_IB_DEFAULT_FR_WR + 1) +
-                        (RDS_IB_DEFAULT_FR_INV_WR + 1)
-                        : 0;
+       fr_queue_space = (rds_ibdev->use_fastreg ? RDS_IB_DEFAULT_FR_WR : 0);
 
        /* add the conn now so that connection establishment has the dev */
        rds_ib_add_conn(rds_ibdev, conn);
        attr.send_cq = ic->i_send_cq;
        attr.recv_cq = ic->i_recv_cq;
        atomic_set(&ic->i_fastreg_wrs, RDS_IB_DEFAULT_FR_WR);
-       atomic_set(&ic->i_fastunreg_wrs, RDS_IB_DEFAULT_FR_INV_WR);
 
        /*
         * XXX this can fail if max_*_wr is too large?  Are we supposed
                wait_event(rds_ib_ring_empty_wait,
                           rds_ib_ring_empty(&ic->i_recv_ring) &&
                           (atomic_read(&ic->i_signaled_sends) == 0) &&
-                          (atomic_read(&ic->i_fastreg_wrs) == RDS_IB_DEFAULT_FR_WR) &&
-                          (atomic_read(&ic->i_fastunreg_wrs) == RDS_IB_DEFAULT_FR_INV_WR));
+                          (atomic_read(&ic->i_fastreg_wrs) == RDS_IB_DEFAULT_FR_WR));
                tasklet_kill(&ic->i_send_tasklet);
                tasklet_kill(&ic->i_recv_tasklet);
 
 
        if (frmr->fr_state != FRMR_IS_INUSE)
                goto out;
 
-       while (atomic_dec_return(&ibmr->ic->i_fastunreg_wrs) <= 0) {
-               atomic_inc(&ibmr->ic->i_fastunreg_wrs);
+       while (atomic_dec_return(&ibmr->ic->i_fastreg_wrs) <= 0) {
+               atomic_inc(&ibmr->ic->i_fastreg_wrs);
                cpu_relax();
        }
 
        if (unlikely(ret)) {
                frmr->fr_state = FRMR_IS_STALE;
                frmr->fr_inv = false;
-               atomic_inc(&ibmr->ic->i_fastunreg_wrs);
+               atomic_inc(&ibmr->ic->i_fastreg_wrs);
                pr_err("RDS/IB: %s returned error(%d)\n", __func__, ret);
                goto out;
        }
        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,