Skip to content

Commit 5a869d0

Browse files
twilfredokeithbusch
authored andcommitted
nvme/tcp: handle tls partially sent records in write_space()
With TLS enabled, records that are encrypted and appended to TLS TX list can fail to see a retry if the underlying TCP socket is busy, for example, hitting an EAGAIN from tcp_sendmsg_locked(). This is not known to the NVMe TCP driver, as the TLS layer successfully generated a record. Typically, the TLS write_space() callback would ensure such records are retried, but in the NVMe TCP Host driver, write_space() invokes nvme_tcp_write_space(). This causes a partially sent record in the TLS TX list to timeout after not being retried. This patch fixes the above by calling queue->write_space(), which calls into the TLS layer to retry any pending records. Fixes: be8e82c ("nvme-tcp: enable TLS handshake upcall") Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Keith Busch <kbusch@kernel.org>
1 parent 7e091ad commit 5a869d0

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

drivers/nvme/host/tcp.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,9 @@ static void nvme_tcp_write_space(struct sock *sk)
10811081
queue = sk->sk_user_data;
10821082
if (likely(queue && sk_stream_is_writeable(sk))) {
10831083
clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
1084+
/* Ensure pending TLS partial records are retried */
1085+
if (nvme_tcp_queue_tls(queue))
1086+
queue->write_space(sk);
10841087
queue_work_on(queue->io_cpu, nvme_tcp_wq, &queue->io_work);
10851088
}
10861089
read_unlock_bh(&sk->sk_callback_lock);

0 commit comments

Comments
 (0)