Skip to content

Commit 3dc8976

Browse files
dhowellskuba-moo
authored andcommitted
tls/device: Convert tls_device_sendpage() to use MSG_SPLICE_PAGES
Convert tls_device_sendpage() to use sendmsg() with MSG_SPLICE_PAGES rather than directly splicing in the pages itself. With that, the tls_iter_offset union is no longer necessary and can be replaced with an iov_iter pointer and the zc_page argument to tls_push_data() can also be removed. 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]> Acked-by: Jakub Kicinski <[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 24763c9 commit 3dc8976

File tree

1 file changed

+23
-69
lines changed

1 file changed

+23
-69
lines changed

net/tls/tls_device.c

Lines changed: 23 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -422,16 +422,10 @@ static int tls_device_copy_data(void *addr, size_t bytes, struct iov_iter *i)
422422
return 0;
423423
}
424424

425-
union tls_iter_offset {
426-
struct iov_iter *msg_iter;
427-
int offset;
428-
};
429-
430425
static int tls_push_data(struct sock *sk,
431-
union tls_iter_offset iter_offset,
426+
struct iov_iter *iter,
432427
size_t size, int flags,
433-
unsigned char record_type,
434-
struct page *zc_page)
428+
unsigned char record_type)
435429
{
436430
struct tls_context *tls_ctx = tls_get_ctx(sk);
437431
struct tls_prot_info *prot = &tls_ctx->prot_info;
@@ -500,22 +494,13 @@ static int tls_push_data(struct sock *sk,
500494
record = ctx->open_record;
501495

502496
copy = min_t(size_t, size, max_open_record_len - record->len);
503-
if (copy && zc_page) {
504-
struct page_frag zc_pfrag;
505-
506-
zc_pfrag.page = zc_page;
507-
zc_pfrag.offset = iter_offset.offset;
508-
zc_pfrag.size = copy;
509-
tls_append_frag(record, &zc_pfrag, copy);
510-
511-
iter_offset.offset += copy;
512-
} else if (copy && (flags & MSG_SPLICE_PAGES)) {
497+
if (copy && (flags & MSG_SPLICE_PAGES)) {
513498
struct page_frag zc_pfrag;
514499
struct page **pages = &zc_pfrag.page;
515500
size_t off;
516501

517-
rc = iov_iter_extract_pages(iter_offset.msg_iter,
518-
&pages, copy, 1, 0, &off);
502+
rc = iov_iter_extract_pages(iter, &pages,
503+
copy, 1, 0, &off);
519504
if (rc <= 0) {
520505
if (rc == 0)
521506
rc = -EIO;
@@ -524,7 +509,7 @@ static int tls_push_data(struct sock *sk,
524509
copy = rc;
525510

526511
if (WARN_ON_ONCE(!sendpage_ok(zc_pfrag.page))) {
527-
iov_iter_revert(iter_offset.msg_iter, copy);
512+
iov_iter_revert(iter, copy);
528513
rc = -EIO;
529514
goto handle_error;
530515
}
@@ -537,7 +522,7 @@ static int tls_push_data(struct sock *sk,
537522

538523
rc = tls_device_copy_data(page_address(pfrag->page) +
539524
pfrag->offset, copy,
540-
iter_offset.msg_iter);
525+
iter);
541526
if (rc)
542527
goto handle_error;
543528
tls_append_frag(record, pfrag, copy);
@@ -592,7 +577,6 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
592577
{
593578
unsigned char record_type = TLS_RECORD_TYPE_DATA;
594579
struct tls_context *tls_ctx = tls_get_ctx(sk);
595-
union tls_iter_offset iter;
596580
int rc;
597581

598582
if (!tls_ctx->zerocopy_sendfile)
@@ -607,8 +591,8 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
607591
goto out;
608592
}
609593

610-
iter.msg_iter = &msg->msg_iter;
611-
rc = tls_push_data(sk, iter, size, msg->msg_flags, record_type, NULL);
594+
rc = tls_push_data(sk, &msg->msg_iter, size, msg->msg_flags,
595+
record_type);
612596

613597
out:
614598
release_sock(sk);
@@ -620,8 +604,7 @@ void tls_device_splice_eof(struct socket *sock)
620604
{
621605
struct sock *sk = sock->sk;
622606
struct tls_context *tls_ctx = tls_get_ctx(sk);
623-
union tls_iter_offset iter;
624-
struct iov_iter iov_iter = {};
607+
struct iov_iter iter = {};
625608

626609
if (!tls_is_partially_sent_record(tls_ctx))
627610
return;
@@ -630,9 +613,8 @@ void tls_device_splice_eof(struct socket *sock)
630613
lock_sock(sk);
631614

632615
if (tls_is_partially_sent_record(tls_ctx)) {
633-
iov_iter_bvec(&iov_iter, ITER_SOURCE, NULL, 0, 0);
634-
iter.msg_iter = &iov_iter;
635-
tls_push_data(sk, iter, 0, 0, TLS_RECORD_TYPE_DATA, NULL);
616+
iov_iter_bvec(&iter, ITER_SOURCE, NULL, 0, 0);
617+
tls_push_data(sk, &iter, 0, 0, TLS_RECORD_TYPE_DATA);
636618
}
637619

638620
release_sock(sk);
@@ -642,44 +624,18 @@ void tls_device_splice_eof(struct socket *sock)
642624
int tls_device_sendpage(struct sock *sk, struct page *page,
643625
int offset, size_t size, int flags)
644626
{
645-
struct tls_context *tls_ctx = tls_get_ctx(sk);
646-
union tls_iter_offset iter_offset;
647-
struct iov_iter msg_iter;
648-
char *kaddr;
649-
struct kvec iov;
650-
int rc;
627+
struct bio_vec bvec;
628+
struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
651629

652630
if (flags & MSG_SENDPAGE_NOTLAST)
653-
flags |= MSG_MORE;
654-
655-
mutex_lock(&tls_ctx->tx_lock);
656-
lock_sock(sk);
631+
msg.msg_flags |= MSG_MORE;
657632

658-
if (flags & MSG_OOB) {
659-
rc = -EOPNOTSUPP;
660-
goto out;
661-
}
662-
663-
if (tls_ctx->zerocopy_sendfile) {
664-
iter_offset.offset = offset;
665-
rc = tls_push_data(sk, iter_offset, size,
666-
flags, TLS_RECORD_TYPE_DATA, page);
667-
goto out;
668-
}
669-
670-
kaddr = kmap(page);
671-
iov.iov_base = kaddr + offset;
672-
iov.iov_len = size;
673-
iov_iter_kvec(&msg_iter, ITER_SOURCE, &iov, 1, size);
674-
iter_offset.msg_iter = &msg_iter;
675-
rc = tls_push_data(sk, iter_offset, size, flags, TLS_RECORD_TYPE_DATA,
676-
NULL);
677-
kunmap(page);
633+
if (flags & MSG_OOB)
634+
return -EOPNOTSUPP;
678635

679-
out:
680-
release_sock(sk);
681-
mutex_unlock(&tls_ctx->tx_lock);
682-
return rc;
636+
bvec_set_page(&bvec, page, size, offset);
637+
iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
638+
return tls_device_sendmsg(sk, &msg, size);
683639
}
684640

685641
struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context,
@@ -744,12 +700,10 @@ EXPORT_SYMBOL(tls_get_record);
744700

745701
static int tls_device_push_pending_record(struct sock *sk, int flags)
746702
{
747-
union tls_iter_offset iter;
748-
struct iov_iter msg_iter;
703+
struct iov_iter iter;
749704

750-
iov_iter_kvec(&msg_iter, ITER_SOURCE, NULL, 0, 0);
751-
iter.msg_iter = &msg_iter;
752-
return tls_push_data(sk, iter, 0, flags, TLS_RECORD_TYPE_DATA, NULL);
705+
iov_iter_kvec(&iter, ITER_SOURCE, NULL, 0, 0);
706+
return tls_push_data(sk, &iter, 0, flags, TLS_RECORD_TYPE_DATA);
753707
}
754708

755709
void tls_device_write_space(struct sock *sk, struct tls_context *ctx)

0 commit comments

Comments
 (0)