Whamcloud - gitweb
LU-15851 lnet: Adjust niov checks for large MD
authorChris Horn <chris.horn@hpe.com>
Sat, 16 Apr 2022 16:01:57 +0000 (10:01 -0600)
committerAndreas Dilger <adilger@whamcloud.com>
Sat, 27 Apr 2024 22:27:48 +0000 (22:27 +0000)
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 <chris.horn@hpe.com>
Change-Id: Iaa851d90f735d04e5167bb9c07235625759245b2
Reviewed-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/54847
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lnet/klnds/o2iblnd/o2iblnd_cb.c
lnet/klnds/socklnd/socklnd_cb.c

index f0e28d8..5a1247c 100644 (file)
@@ -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());
index d2a83a2..22717a0 100644 (file)
@@ -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));