diff options
author | Jakub Kicinski <kuba@kernel.org> | 2022-07-22 16:50:33 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2022-07-26 14:38:51 -0700 |
commit | 84c61fe1a75b4255df1e1e7c054c9e6d048da417 (patch) | |
tree | d3c53a4093eb61d366bb5b796e4f829cd8768e06 /include | |
parent | 8b3c59a7a0bed6fe365755ac211dcf94fdac81b4 (diff) | |
download | linux-stable-84c61fe1a75b4255df1e1e7c054c9e6d048da417.tar.gz linux-stable-84c61fe1a75b4255df1e1e7c054c9e6d048da417.tar.bz2 linux-stable-84c61fe1a75b4255df1e1e7c054c9e6d048da417.zip |
tls: rx: do not use the standard strparser
TLS is a relatively poor fit for strparser. We pause the input
every time a message is received, wait for a read which will
decrypt the message, start the parser, repeat. strparser is
built to delineate the messages, wrap them in individual skbs
and let them float off into the stack or a different socket.
TLS wants the data pages and nothing else. There's no need
for TLS to keep cloning (and occasionally skb_unclone()'ing)
the TCP rx queue.
This patch uses a pre-allocated skb and attaches the skbs
from the TCP rx queue to it as frags. TLS is careful never
to modify the input skb without CoW'ing / detaching it first.
Since we call TCP rx queue cleanup directly we also get back
the benefit of skb deferred free.
Overall this results in a 6% gain in my benchmarks.
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/tls.h | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/include/net/tls.h b/include/net/tls.h index 181c496b01b8..abb050b0df83 100644 --- a/include/net/tls.h +++ b/include/net/tls.h @@ -108,18 +108,33 @@ struct tls_sw_context_tx { unsigned long tx_bitmask; }; +struct tls_strparser { + struct sock *sk; + + u32 mark : 8; + u32 stopped : 1; + u32 copy_mode : 1; + u32 msg_ready : 1; + + struct strp_msg stm; + + struct sk_buff *anchor; + struct work_struct work; +}; + struct tls_sw_context_rx { struct crypto_aead *aead_recv; struct crypto_wait async_wait; - struct strparser strp; struct sk_buff_head rx_list; /* list of decrypted 'data' records */ void (*saved_data_ready)(struct sock *sk); - struct sk_buff *recv_pkt; u8 reader_present; u8 async_capable:1; u8 zc_capable:1; u8 reader_contended:1; + + struct tls_strparser strp; + atomic_t decrypt_pending; /* protect crypto_wait with decrypt_pending*/ spinlock_t decrypt_compl_lock; |