David Howells
unread,Jun 23, 2023, 6:56:00 PM6/23/23Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to net...@vger.kernel.org, David Howells, Alexander Duyck, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Willem de Bruijn, David Ahern, Matthew Wilcox, Jens Axboe, linu...@kvack.org, linux-...@vger.kernel.org, Mike Christie, Maurizio Lombardi, James E.J. Bottomley, Martin K. Petersen, Al Viro, open-...@googlegroups.com, linux...@vger.kernel.org, target...@vger.kernel.org
Use sendmsg() with MSG_SPLICE_PAGES rather than sendpage. This allows
multiple pages and multipage folios to be passed through.
TODO: iscsit_fe_sendpage_sg() should perhaps set up a bio_vec array for the
entire set of pages it's going to transfer plus two for the header and
trailer and page fragments to hold the header and trailer - and then call
sendmsg once for the entire message.
Signed-off-by: David Howells <
dhow...@redhat.com>
cc: Mike Christie <
michael....@oracle.com>
cc: Maurizio Lombardi <
mlom...@redhat.com>
cc: "James E.J. Bottomley" <
je...@linux.ibm.com>
cc: "Martin K. Petersen" <
martin....@oracle.com>
cc: "David S. Miller" <
da...@davemloft.net>
cc: Eric Dumazet <
edum...@google.com>
cc: Jakub Kicinski <
ku...@kernel.org>
cc: Paolo Abeni <
pab...@redhat.com>
cc: Jens Axboe <
ax...@kernel.dk>
cc: Matthew Wilcox <
wi...@infradead.org>
cc: Al Viro <
vi...@zeniv.linux.org.uk>
cc:
open-...@googlegroups.com
cc:
linux...@vger.kernel.org
cc:
target...@vger.kernel.org
cc:
net...@vger.kernel.org
---
Notes:
ver #5)
- Split iscsi changes into client and target patches
ver #2)
- Wrap lines at 80.
drivers/target/iscsi/iscsi_target_util.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c
index b14835fcb033..6231fa4ef5c6 100644
--- a/drivers/target/iscsi/iscsi_target_util.c
+++ b/drivers/target/iscsi/iscsi_target_util.c
@@ -1129,6 +1129,8 @@ int iscsit_fe_sendpage_sg(
struct iscsit_conn *conn)
{
struct scatterlist *sg = cmd->first_data_sg;
+ struct bio_vec bvec;
+ struct msghdr msghdr = { .msg_flags = MSG_SPLICE_PAGES, };
struct kvec iov;
u32 tx_hdr_size, data_len;
u32 offset = cmd->first_data_sg_off;
@@ -1172,17 +1174,18 @@ int iscsit_fe_sendpage_sg(
u32 space = (sg->length - offset);
u32 sub_len = min_t(u32, data_len, space);
send_pg:
- tx_sent = conn->sock->ops->sendpage(conn->sock,
- sg_page(sg), sg->offset + offset, sub_len, 0);
+ bvec_set_page(&bvec, sg_page(sg), sub_len, sg->offset + offset);
+ iov_iter_bvec(&msghdr.msg_iter, ITER_SOURCE, &bvec, 1, sub_len);
+
+ tx_sent = conn->sock->ops->sendmsg(conn->sock, &msghdr,
+ sub_len);
if (tx_sent != sub_len) {
if (tx_sent == -EAGAIN) {
- pr_err("tcp_sendpage() returned"
- " -EAGAIN\n");
+ pr_err("sendmsg/splice returned -EAGAIN\n");
goto send_pg;
}
- pr_err("tcp_sendpage() failure: %d\n",
- tx_sent);
+ pr_err("sendmsg/splice failure: %d\n", tx_sent);
return -1;
}