From f01456a070afbb317e31ac0f99caa81375331fa4 Mon Sep 17 00:00:00 2001 From: Yang Sheng Date: Tue, 11 Feb 2025 03:35:20 +0800 Subject: [PATCH] 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 --- lnet/klnds/socklnd/socklnd_lib.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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; -- 1.8.3.1