commit ca4c3cd9c36cdac39d4769a125d613d3e91207de
Author: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
Date:   Tue Jul 6 12:51:37 2021 -0400

    LU-14733 - Avoid double posting invalidate
    
    Signed-off-by: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>

diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c
index 86a77c7..8a14b86 100644
--- a/lnet/klnds/o2iblnd/o2iblnd.c
+++ b/lnet/klnds/o2iblnd/o2iblnd.c
@@ -1823,6 +1823,7 @@ kiblnd_fmr_pool_unmap(struct kib_fmr *fmr, int status)
 
 		if (frd) {
 			frd->frd_valid = false;
+			frd->frd_posted = false;
 			fmr->fmr_frd = NULL;
 			spin_lock(&fps->fps_lock);
 			list_add_tail(&frd->frd_list, &fpo->fast_reg.fpo_pool_list);
@@ -1992,6 +1993,7 @@ again:
 				fmr->fmr_key  = is_rx ? mr->rkey : mr->lkey;
 				fmr->fmr_frd  = frd;
 				fmr->fmr_pool = fpo;
+				frd->frd_posted = false;
 				return 0;
 			}
 			spin_unlock(&fps->fps_lock);
diff --git a/lnet/klnds/o2iblnd/o2iblnd.h b/lnet/klnds/o2iblnd/o2iblnd.h
index 8bdb127..3e24405 100644
--- a/lnet/klnds/o2iblnd/o2iblnd.h
+++ b/lnet/klnds/o2iblnd/o2iblnd.h
@@ -331,6 +331,7 @@ struct kib_fast_reg_descriptor { /* For fast registration */
 #endif
 	struct ib_mr			*frd_mr;
 	bool				 frd_valid;
+	bool				 frd_posted;
 };
 
 struct kib_fmr_pool {
diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c
index 0f5f68d..98c5a5d 100644
--- a/lnet/klnds/o2iblnd/o2iblnd_cb.c
+++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c
@@ -888,6 +888,7 @@ __must_hold(&conn->ibc_lock)
 	struct kib_msg *msg = tx->tx_msg;
 	struct kib_peer_ni *peer_ni = conn->ibc_peer;
 	struct lnet_ni *ni = peer_ni->ibp_ni;
+	struct kib_fast_reg_descriptor *frd = tx->tx_fmr.fmr_frd;
 	int ver = conn->ibc_version;
 	int rc;
 	int done;
@@ -972,11 +973,10 @@ __must_hold(&conn->ibc_lock)
                 /* close_conn will launch failover */
                 rc = -ENETDOWN;
         } else {
-		struct kib_fast_reg_descriptor *frd = tx->tx_fmr.fmr_frd;
 		struct ib_send_wr *bad = &tx->tx_wrq[tx->tx_nwrq - 1].wr;
 		struct ib_send_wr *wr  = &tx->tx_wrq[0].wr;
 
-		if (frd != NULL) {
+		if (frd != NULL && !frd->frd_posted) {
 			if (!frd->frd_valid) {
 				wr = &frd->frd_inv_wr.wr;
 				wr->next = &frd->frd_fastreg_wr.wr;
@@ -1005,8 +1005,11 @@ __must_hold(&conn->ibc_lock)
 
 	conn->ibc_last_send = ktime_get();
 
-        if (rc == 0)
+        if (rc == 0) {
+		if (frd != NULL)
+			frd->frd_posted = true;
                 return 0;
+	}
 
         /* NB credits are transferred in the actual
          * message, which can only be the last work item */