From: Chris Horn Date: Sat, 16 Apr 2022 16:01:57 +0000 (-0600) Subject: LU-15851 lnet: Adjust niov checks for large MD X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=5b454b6ee371d64894e18b2329622929c89deea1;p=fs%2Flustre-release.git LU-15851 lnet: Adjust niov checks for large MD An LNet user can allocate a large contiguous MD. That MD can have > LNET_MAX_IOV pages which causes some LNDs to assert on either niov argument passed to lnd_recv() or the value stored in lnet_msg::msg_niov. This is true even in cases where the actual transfer size is <= LNET_MTU and will not exceed limits in the LNDs. Adjust ksocklnd_send()/ksocklnd_recv() to assert on the return value of lnet_extract_kiov(). Remove the assert on msg_niov (payload_niov) from kiblnd_send(). kiblnd_setup_rd_kiov() will already fail if we exceed ko2iblnd's available scatter gather entries. Lustre-change: https://review.whamcloud.com/47319 Lustre-commit: 105193b4a147257a0f9332053a16eb676dc99623 HPE-bug-id: LUS-10878 Test-Parameters: trivial Fixes: 857f11169f ("LU-13004 lnet: always put a page list into struct lnet_libmd") Signed-off-by: Chris Horn Change-Id: Iaa851d90f735d04e5167bb9c07235625759245b2 Reviewed-by: Shaun Tancheff Reviewed-by: Serguei Smirnov Reviewed-by: Alexey Lyashkov Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/54847 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index f0e28d8..5a1247c 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -1684,7 +1684,6 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) payload_nob, payload_niov, libcfs_id2str(target)); LASSERT (payload_nob == 0 || payload_niov > 0); - LASSERT (payload_niov <= LNET_MAX_IOV); /* Thread context */ LASSERT (!in_interrupt()); diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index d2a83a2..22717a0 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -993,7 +993,6 @@ ksocknal_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) payload_nob, payload_niov, libcfs_id2str(target)); LASSERT (payload_nob == 0 || payload_niov > 0); - LASSERT (payload_niov <= LNET_MAX_IOV); LASSERT (!in_interrupt ()); desc_size = offsetof(struct ksock_tx, @@ -1020,6 +1019,8 @@ ksocknal_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) payload_niov, payload_kiov, payload_offset, payload_nob); + LASSERT(tx->tx_nkiov <= LNET_MAX_IOV); + if (payload_nob >= *ksocknal_tunables.ksnd_zc_min_payload) tx->tx_zc_capable = 1; @@ -1368,7 +1369,6 @@ ksocknal_recv(struct lnet_ni *ni, void *private, struct lnet_msg *msg, struct ksock_sched *sched = conn->ksnc_scheduler; LASSERT (mlen <= rlen); - LASSERT (niov <= LNET_MAX_IOV); conn->ksnc_lnet_msg = msg; conn->ksnc_rx_nob_wanted = mlen; @@ -1388,6 +1388,7 @@ ksocknal_recv(struct lnet_ni *ni, void *private, struct lnet_msg *msg, niov, kiov, offset, mlen); } + LASSERT(conn->ksnc_rx_nkiov <= LNET_MAX_IOV); LASSERT (mlen == lnet_iov_nob (conn->ksnc_rx_niov, conn->ksnc_rx_iov) + lnet_kiov_nob (conn->ksnc_rx_nkiov, conn->ksnc_rx_kiov));