@@ -422,16 +422,10 @@ static int tls_device_copy_data(void *addr, size_t bytes, struct iov_iter *i)
422
422
return 0 ;
423
423
}
424
424
425
- union tls_iter_offset {
426
- struct iov_iter * msg_iter ;
427
- int offset ;
428
- };
429
-
430
425
static int tls_push_data (struct sock * sk ,
431
- union tls_iter_offset iter_offset ,
426
+ struct iov_iter * iter ,
432
427
size_t size , int flags ,
433
- unsigned char record_type ,
434
- struct page * zc_page )
428
+ unsigned char record_type )
435
429
{
436
430
struct tls_context * tls_ctx = tls_get_ctx (sk );
437
431
struct tls_prot_info * prot = & tls_ctx -> prot_info ;
@@ -500,22 +494,13 @@ static int tls_push_data(struct sock *sk,
500
494
record = ctx -> open_record ;
501
495
502
496
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 )) {
513
498
struct page_frag zc_pfrag ;
514
499
struct page * * pages = & zc_pfrag .page ;
515
500
size_t off ;
516
501
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 );
519
504
if (rc <= 0 ) {
520
505
if (rc == 0 )
521
506
rc = - EIO ;
@@ -524,7 +509,7 @@ static int tls_push_data(struct sock *sk,
524
509
copy = rc ;
525
510
526
511
if (WARN_ON_ONCE (!sendpage_ok (zc_pfrag .page ))) {
527
- iov_iter_revert (iter_offset . msg_iter , copy );
512
+ iov_iter_revert (iter , copy );
528
513
rc = - EIO ;
529
514
goto handle_error ;
530
515
}
@@ -537,7 +522,7 @@ static int tls_push_data(struct sock *sk,
537
522
538
523
rc = tls_device_copy_data (page_address (pfrag -> page ) +
539
524
pfrag -> offset , copy ,
540
- iter_offset . msg_iter );
525
+ iter );
541
526
if (rc )
542
527
goto handle_error ;
543
528
tls_append_frag (record , pfrag , copy );
@@ -592,7 +577,6 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
592
577
{
593
578
unsigned char record_type = TLS_RECORD_TYPE_DATA ;
594
579
struct tls_context * tls_ctx = tls_get_ctx (sk );
595
- union tls_iter_offset iter ;
596
580
int rc ;
597
581
598
582
if (!tls_ctx -> zerocopy_sendfile )
@@ -607,8 +591,8 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
607
591
goto out ;
608
592
}
609
593
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 );
612
596
613
597
out :
614
598
release_sock (sk );
@@ -620,8 +604,7 @@ void tls_device_splice_eof(struct socket *sock)
620
604
{
621
605
struct sock * sk = sock -> sk ;
622
606
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 = {};
625
608
626
609
if (!tls_is_partially_sent_record (tls_ctx ))
627
610
return ;
@@ -630,9 +613,8 @@ void tls_device_splice_eof(struct socket *sock)
630
613
lock_sock (sk );
631
614
632
615
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 );
636
618
}
637
619
638
620
release_sock (sk );
@@ -642,44 +624,18 @@ void tls_device_splice_eof(struct socket *sock)
642
624
int tls_device_sendpage (struct sock * sk , struct page * page ,
643
625
int offset , size_t size , int flags )
644
626
{
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 , };
651
629
652
630
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 ;
657
632
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 ;
678
635
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 );
683
639
}
684
640
685
641
struct tls_record_info * tls_get_record (struct tls_offload_context_tx * context ,
@@ -744,12 +700,10 @@ EXPORT_SYMBOL(tls_get_record);
744
700
745
701
static int tls_device_push_pending_record (struct sock * sk , int flags )
746
702
{
747
- union tls_iter_offset iter ;
748
- struct iov_iter msg_iter ;
703
+ struct iov_iter iter ;
749
704
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 );
753
707
}
754
708
755
709
void tls_device_write_space (struct sock * sk , struct tls_context * ctx )
0 commit comments