From 105193b4a147257a0f9332053a16eb676dc99623 Mon Sep 17 00:00:00 2001 From: Chris Horn Date: Sat, 16 Apr 2022 10:01:57 -0600 Subject: [PATCH] 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. 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-on: https://review.whamcloud.com/47319 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Shaun Tancheff Reviewed-by: Serguei Smirnov Reviewed-by: Alexey Lyashkov Reviewed-by: Oleg Drokin --- lnet/klnds/o2iblnd/o2iblnd_cb.c | 1 - lnet/klnds/socklnd/socklnd_cb.c | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index d3b3eec..1030bba 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -1671,7 +1671,6 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) payload_nob, payload_niov, libcfs_idstr(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 418b7b4..6b2ba50 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -1003,7 +1003,6 @@ ksocknal_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) payload_nob, payload_niov, libcfs_idstr(target)); LASSERT (payload_nob == 0 || payload_niov > 0); - LASSERT (payload_niov <= LNET_MAX_IOV); LASSERT (!in_interrupt ()); desc_size = offsetof(struct ksock_tx, @@ -1030,6 +1029,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; @@ -1373,7 +1374,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; @@ -1393,6 +1393,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)); -- 1.8.3.1