Skip to content

Commit fe1e81d

Browse files
dhowellskuba-moo
authored andcommitted
tls/sw: Support MSG_SPLICE_PAGES
Make TLS's sendmsg() support MSG_SPLICE_PAGES. This causes pages to be spliced from the source iterator if possible. This allows ->sendpage() to be replaced by something that can handle multiple multipage folios in a single transaction. Signed-off-by: David Howells <[email protected]> cc: Chuck Lever <[email protected]> cc: Boris Pismenny <[email protected]> cc: John Fastabend <[email protected]> cc: Jens Axboe <[email protected]> cc: Matthew Wilcox <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 219d920 commit fe1e81d

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

net/tls/tls_sw.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,35 @@ static int tls_sw_push_pending_record(struct sock *sk, int flags)
931931
&copied, flags);
932932
}
933933

934+
static int tls_sw_sendmsg_splice(struct sock *sk, struct msghdr *msg,
935+
struct sk_msg *msg_pl, size_t try_to_copy,
936+
ssize_t *copied)
937+
{
938+
struct page *page = NULL, **pages = &page;
939+
940+
do {
941+
ssize_t part;
942+
size_t off;
943+
944+
part = iov_iter_extract_pages(&msg->msg_iter, &pages,
945+
try_to_copy, 1, 0, &off);
946+
if (part <= 0)
947+
return part ?: -EIO;
948+
949+
if (WARN_ON_ONCE(!sendpage_ok(page))) {
950+
iov_iter_revert(&msg->msg_iter, part);
951+
return -EIO;
952+
}
953+
954+
sk_msg_page_add(msg_pl, page, part, off);
955+
sk_mem_charge(sk, part);
956+
*copied += part;
957+
try_to_copy -= part;
958+
} while (try_to_copy && !sk_msg_full(msg_pl));
959+
960+
return 0;
961+
}
962+
934963
int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
935964
{
936965
long timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
@@ -1020,6 +1049,17 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
10201049
full_record = true;
10211050
}
10221051

1052+
if (try_to_copy && (msg->msg_flags & MSG_SPLICE_PAGES)) {
1053+
ret = tls_sw_sendmsg_splice(sk, msg, msg_pl,
1054+
try_to_copy, &copied);
1055+
if (ret < 0)
1056+
goto send_end;
1057+
tls_ctx->pending_open_record_frags = true;
1058+
if (full_record || eor || sk_msg_full(msg_pl))
1059+
goto copied;
1060+
continue;
1061+
}
1062+
10231063
if (!is_kvec && (full_record || eor) && !async_capable) {
10241064
u32 first = msg_pl->sg.end;
10251065

@@ -1084,6 +1124,7 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
10841124
*/
10851125
tls_ctx->pending_open_record_frags = true;
10861126
copied += try_to_copy;
1127+
copied:
10871128
if (full_record || eor) {
10881129
ret = bpf_exec_tx_verdict(msg_pl, sk, full_record,
10891130
record_type, &copied,

0 commit comments

Comments
 (0)