[lustre-devel] [PATCH 060/622] lnet: ko2iblnd: determine gaps correctly

James Simmons jsimmons at infradead.org
Thu Feb 27 13:08:48 PST 2020


From: Amir Shehata <ashehata at whamcloud.com>

We're allowed to start at a non-aligned page offset in the first
fragment and end at a non-aligned page offset in the last fragment.

When checking the iovec exclude both of the first and last fragments
from the tx_gaps check.

WC-bug-id: https://jira.whamcloud.com/browse/LU-11064
Lustre-commit: e40ea6fd4494 ("LU-11064 lnd: determine gaps correctly")
Signed-off-by: Amir Shehata <ashehata at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/32586
Reviewed-by: Doug Oucharek <dougso at me.com>
Reviewed-by: James Simmons <uja.ornl at yahoo.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
 net/lnet/klnds/o2iblnd/o2iblnd_cb.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/net/lnet/klnds/o2iblnd/o2iblnd_cb.c b/net/lnet/klnds/o2iblnd/o2iblnd_cb.c
index c2ce3b9..60706b4 100644
--- a/net/lnet/klnds/o2iblnd/o2iblnd_cb.c
+++ b/net/lnet/klnds/o2iblnd/o2iblnd_cb.c
@@ -737,6 +737,7 @@ static int kiblnd_map_tx(struct lnet_ni *ni, struct kib_tx *tx,
 	struct kib_net *net = ni->ni_data;
 	struct scatterlist *sg;
 	int fragnob;
+	int max_nkiov;
 
 	CDEBUG(D_NET, "niov %d offset %d nob %d\n", nkiov, offset, nob);
 
@@ -751,16 +752,24 @@ static int kiblnd_map_tx(struct lnet_ni *ni, struct kib_tx *tx,
 		LASSERT(nkiov > 0);
 	}
 
+	max_nkiov = nkiov;
+
 	sg = tx->tx_frags;
 	do {
 		LASSERT(nkiov > 0);
 
 		fragnob = min((int)(kiov->bv_len - offset), nob);
 
-		if ((fragnob < (int)(kiov->bv_len - offset)) && nkiov > 1) {
+		/* We're allowed to start at a non-aligned page offset in
+		 * the first fragment and end at a non-aligned page offset
+		 * in the last fragment.
+		 */
+		if ((fragnob < (int)(kiov->bv_len - offset)) &&
+		    nkiov < max_nkiov && nob > fragnob) {
 			CDEBUG(D_NET,
-			       "fragnob %d < available page %d: with remaining %d kiovs\n",
-			       fragnob, (int)(kiov->bv_len - offset), nkiov);
+			       "fragnob %d < available page %d: with remaining %d kiovs with %d nob left\n",
+			       fragnob, (int)(kiov->bv_len - offset),
+			       nkiov, nob);
 			tx->tx_gaps = true;
 		}
 
-- 
1.8.3.1



More information about the lustre-devel mailing list