git: 6b313a3a6045 - main - Include the trailer in the original dst_iov.

John Baldwin jhb at FreeBSD.org
Tue May 25 23:59:44 UTC 2021


The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=6b313a3a60453e87f0a224361dad6284550395de

commit 6b313a3a60453e87f0a224361dad6284550395de
Author:     John Baldwin <jhb at FreeBSD.org>
AuthorDate: 2021-05-25 23:59:19 +0000
Commit:     John Baldwin <jhb at FreeBSD.org>
CommitDate: 2021-05-25 23:59:19 +0000

    Include the trailer in the original dst_iov.
    
    This avoids creating a duplicate copy on the stack just to
    append the trailer.
    
    Reviewed by:    gallatin, markj
    Sponsored by:   Netflix
    Differential Revision:  https://reviews.freebsd.org/D30139
---
 sys/kern/uipc_ktls.c      | 12 +++++++++---
 sys/opencrypto/ktls_ocf.c | 27 ++++++---------------------
 2 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/sys/kern/uipc_ktls.c b/sys/kern/uipc_ktls.c
index 5ca677a26e2c..b0d7ea8016dd 100644
--- a/sys/kern/uipc_ktls.c
+++ b/sys/kern/uipc_ktls.c
@@ -1981,14 +1981,16 @@ ktls_enqueue(struct mbuf *m, struct socket *so, int page_count)
 	counter_u64_add(ktls_cnt_tx_queued, 1);
 }
 
+#define	MAX_TLS_PAGES	(1 + btoc(TLS_MAX_MSG_SIZE_V10_2))
+
 static __noinline void
 ktls_encrypt(struct ktls_wq *wq, struct mbuf *top)
 {
 	struct ktls_session *tls;
 	struct socket *so;
 	struct mbuf *m;
-	vm_paddr_t parray[1 + btoc(TLS_MAX_MSG_SIZE_V10_2)];
-	struct iovec dst_iov[1 + btoc(TLS_MAX_MSG_SIZE_V10_2)];
+	vm_paddr_t parray[MAX_TLS_PAGES + 1];
+	struct iovec dst_iov[MAX_TLS_PAGES + 2];
 	vm_page_t pg;
 	void *cbuf;
 	int error, i, len, npages, off, total_pages;
@@ -2072,8 +2074,12 @@ ktls_encrypt(struct ktls_wq *wq, struct mbuf *top)
 					dst_iov[i].iov_len = len;
 				}
 			}
+			KASSERT(i + 1 <= nitems(dst_iov),
+			    ("dst_iov is too small"));
+			dst_iov[i].iov_base = m->m_epg_trail;
+			dst_iov[i].iov_len = m->m_epg_trllen;
 
-			error = (*tls->sw_encrypt)(tls, m, dst_iov, i);
+			error = (*tls->sw_encrypt)(tls, m, dst_iov, i + 1);
 
 			/* Free the old pages. */
 			m->m_ext.ext_free(m);
diff --git a/sys/opencrypto/ktls_ocf.c b/sys/opencrypto/ktls_ocf.c
index 1d83cd6f93dc..bbe26e3f5f18 100644
--- a/sys/opencrypto/ktls_ocf.c
+++ b/sys/opencrypto/ktls_ocf.c
@@ -286,13 +286,8 @@ ktls_ocf_tls_cbc_encrypt(struct ktls_session *tls, struct mbuf *m,
 		memcpy(crp.crp_iv, hdr + 1, AES_BLOCK_LEN);
 
 	if (outiov != NULL) {
-		/* Duplicate iovec and append vector for trailer. */
-		memcpy(iov, outiov, outiovcnt * sizeof(struct iovec));
-		iov[outiovcnt].iov_base = m->m_epg_trail;
-		iov[outiovcnt].iov_len = m->m_epg_trllen;
-
-		uio.uio_iov = iov;
-		uio.uio_iovcnt = outiovcnt + 1;
+		uio.uio_iov = outiov;
+		uio.uio_iovcnt = outiovcnt;
 		uio.uio_offset = 0;
 		uio.uio_segflg = UIO_SYSSPACE;
 		uio.uio_td = curthread;
@@ -336,7 +331,6 @@ ktls_ocf_tls12_aead_encrypt(struct ktls_session *tls, struct mbuf *m,
 	struct tls_aead_data ad;
 	struct cryptop crp;
 	struct ocf_session *os;
-	struct iovec iov[outiovcnt + 1];
 	int error;
 	uint16_t tls_comp_len;
 
@@ -376,14 +370,10 @@ ktls_ocf_tls12_aead_encrypt(struct ktls_session *tls, struct mbuf *m,
 	crp.crp_payload_length = tls_comp_len;
 
 	if (outiov != NULL) {
-		/* Duplicate iovec and append vector for tag. */
-		memcpy(iov, outiov, outiovcnt * sizeof(struct iovec));
-		iov[outiovcnt].iov_base = m->m_epg_trail;
-		iov[outiovcnt].iov_len = tls->params.tls_tlen;
 		crp.crp_digest_start = crp.crp_payload_length;
 
-		uio.uio_iov = iov;
-		uio.uio_iovcnt = outiovcnt + 1;
+		uio.uio_iov = outiov;
+		uio.uio_iovcnt = outiovcnt;
 		uio.uio_offset = 0;
 		uio.uio_segflg = UIO_SYSSPACE;
 		uio.uio_td = curthread;
@@ -486,7 +476,6 @@ ktls_ocf_tls13_aead_encrypt(struct ktls_session *tls, struct mbuf *m,
 	char nonce[12];
 	struct cryptop crp;
 	struct ocf_session *os;
-	struct iovec iov[outiovcnt + 1];
 	int error;
 
 	os = tls->cipher;
@@ -516,14 +505,10 @@ ktls_ocf_tls13_aead_encrypt(struct ktls_session *tls, struct mbuf *m,
 	crp.crp_payload_length++;
 
 	if (outiov != NULL) {
-		/* Duplicate iovec and append vector for tag. */
-		memcpy(iov, outiov, outiovcnt * sizeof(struct iovec));
-		iov[outiovcnt].iov_base = m->m_epg_trail;
-		iov[outiovcnt].iov_len = tls->params.tls_tlen;
 		crp.crp_digest_start = crp.crp_payload_length;
 
-		uio.uio_iov = iov;
-		uio.uio_iovcnt = outiovcnt + 1;
+		uio.uio_iov = outiov;
+		uio.uio_iovcnt = outiovcnt;
 		uio.uio_offset = 0;
 		uio.uio_segflg = UIO_SYSSPACE;
 		uio.uio_td = curthread;


More information about the dev-commits-src-all mailing list