Date: Sun, 10 May 2020 00:24:40 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r360860 - projects/nfs-over-tls/sys/kern Message-ID: <202005100024.04A0Oe5D065000@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Sun May 10 00:24:40 2020 New Revision: 360860 URL: https://svnweb.freebsd.org/changeset/base/360860 Log: Modify ktls_decrypt() slightly, so that a small iov is allocated on the stack. As such, it only needs to malloc larger ones. Since most NFS RPC messages only need an iov of size 1 or 2, it seemed to be overkill to malloc/free for those cases. This is not needed for correct behaviour and it will be up to jhb@ whether or not this patch gets applied to his KTLS RX patch. Modified: projects/nfs-over-tls/sys/kern/uipc_ktls.c Modified: projects/nfs-over-tls/sys/kern/uipc_ktls.c ============================================================================== --- projects/nfs-over-tls/sys/kern/uipc_ktls.c Sun May 10 00:17:39 2020 (r360859) +++ projects/nfs-over-tls/sys/kern/uipc_ktls.c Sun May 10 00:24:40 2020 (r360860) @@ -1665,6 +1665,7 @@ m_segments(struct mbuf *m, int skip) return (count); } +#define KTLS_SMALLIOVEC 2 static void ktls_decrypt(struct socket *so) { @@ -1672,7 +1673,7 @@ ktls_decrypt(struct socket *so) struct ktls_session *tls; struct sockbuf *sb; struct tls_record_layer *hdr; - struct iovec *iov; + struct iovec *iov, iv[KTLS_SMALLIOVEC]; struct tls_get_record tgr; struct mbuf *control, *data, *m; uint64_t seqno; @@ -1687,8 +1688,8 @@ ktls_decrypt(struct socket *so) tls = sb->sb_tls_info; MPASS(tls != NULL); - iov = NULL; - iov_cap = 0; + iov = iv; + iov_cap = KTLS_SMALLIOVEC; for (;;) { /* Is there enough queued for a TLS header? */ if (sb->sb_tlscc < tls->params.tls_hlen) @@ -1746,7 +1747,8 @@ ktls_decrypt(struct socket *so) */ iov_count = m_segments(data, tls->params.tls_hlen); if (iov_count > iov_cap) { - free(iov, M_KTLS); + if (iov_cap > KTLS_SMALLIOVEC) + free(iov, M_KTLS); iov = malloc(sizeof(*iov) * iov_count, M_KTLS, M_WAITOK); iov_cap = iov_count; @@ -1865,7 +1867,8 @@ ktls_decrypt(struct socket *so) sorwakeup_locked(so); deref: - free(iov, M_KTLS); + if (iov_cap > KTLS_SMALLIOVEC) + free(iov, M_KTLS); SOCKBUF_UNLOCK_ASSERT(sb); CURVNET_SET(so->so_vnet);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005100024.04A0Oe5D065000>