From: Yang Sheng Date: Mon, 10 Feb 2025 19:35:20 +0000 (+0800) Subject: LU-18749 socklnd: check page for zerocopy X-Git-Tag: 2.16.53~53 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F05%2F58205%2F2;p=fs%2Flustre-release.git LU-18749 socklnd: check page for zerocopy We should check the page state to ensure kernel can handle it in zerocopy case. Signed-off-by: Yang Sheng Change-Id: Ib82989bcca9898ecc176ddc0c9a6cd4eafbad89f Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/58205 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Frank Sehr Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- diff --git a/lnet/klnds/socklnd/socklnd_lib.c b/lnet/klnds/socklnd/socklnd_lib.c index d2ff979..7700fa8 100644 --- a/lnet/klnds/socklnd/socklnd_lib.c +++ b/lnet/klnds/socklnd/socklnd_lib.c @@ -90,12 +90,20 @@ ksocknal_lib_send_hdr(struct ksock_conn *conn, struct ksock_tx *tx, } static int -ksocknal_lib_sendpage(struct socket *sock, struct bio_vec *kiov, int msgflg) +ksocknal_lib_sendpage(struct socket *sock, struct bio_vec *kiov, + int nkiov, int msgflg) { #ifdef MSG_SPLICE_PAGES struct msghdr msg = {.msg_flags = msgflg | MSG_SPLICE_PAGES}; + int i; iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, kiov, 1, kiov->bv_len); + for (i = 0; i < nkiov; i++) { + if (!sendpage_ok(kiov[i].bv_page)) { + msg.msg_flags &= ~MSG_SPLICE_PAGES; + break; + } + } return sock_sendmsg(sock, &msg); #else @@ -132,7 +140,7 @@ ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx, kiov->bv_len < tx->tx_resid) msgflg |= MSG_MORE; - rc = ksocknal_lib_sendpage(sock, kiov, msgflg); + rc = ksocknal_lib_sendpage(sock, kiov, tx->tx_nkiov, msgflg); } else { #if SOCKNAL_SINGLE_FRAG_TX || !SOCKNAL_RISK_KMAP_DEADLOCK struct kvec scratch;