[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210903121757.140357-1-dwagner@suse.de>
Date: Fri, 3 Sep 2021 14:17:57 +0200
From: Daniel Wagner <dwagner@...e.de>
To: linux-nvme@...ts.infradead.org
Cc: linux-kernel@...r.kernel.org, Daniel Wagner <dwagner@...e.de>
Subject: [RFC v1] nvme-tcp: enable linger socket option on shutdown
When the no linger is set, the networking stack sends FIN followed by
RST immediately when shutting down the socket. By enabling linger when
shutting down we have a proper shutdown sequence on the wire.
Signed-off-by: Daniel Wagner <dwagner@...e.de>
---
The current shutdown sequence on the wire is a bit harsh and
doesn't let the remote host to react. I suppose we should
introduce a short (how long?) linger pause when shutting down
the connection. Thoughs?
drivers/nvme/host/tcp.c | 1 +
include/net/sock.h | 1 +
net/core/sock.c | 8 ++++++++
3 files changed, 10 insertions(+)
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index e2ab12f3f51c..6c6dc465147a 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1558,6 +1558,7 @@ static void nvme_tcp_restore_sock_calls(struct nvme_tcp_queue *queue)
static void __nvme_tcp_stop_queue(struct nvme_tcp_queue *queue)
{
+ sock_reset_linger(queue->sock->sk);
kernel_sock_shutdown(queue->sock, SHUT_RDWR);
nvme_tcp_restore_sock_calls(queue);
cancel_work_sync(&queue->io_work);
diff --git a/include/net/sock.h b/include/net/sock.h
index 66a9a90f9558..313a6c8ba51c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -2777,6 +2777,7 @@ int sock_set_timestamping(struct sock *sk, int optname,
void sock_enable_timestamps(struct sock *sk);
void sock_no_linger(struct sock *sk);
+void sock_reset_linger(struct sock *sk);
void sock_set_keepalive(struct sock *sk);
void sock_set_priority(struct sock *sk, u32 priority);
void sock_set_rcvbuf(struct sock *sk, int val);
diff --git a/net/core/sock.c b/net/core/sock.c
index 62627e868e03..23090a01e412 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -755,6 +755,14 @@ void sock_no_linger(struct sock *sk)
}
EXPORT_SYMBOL(sock_no_linger);
+void sock_reset_linger(struct sock *sk)
+{
+ lock_sock(sk);
+ sock_reset_flag(sk, SOCK_LINGER);
+ release_sock(sk);
+}
+EXPORT_SYMBOL_GPL(sock_reset_linger);
+
void sock_set_priority(struct sock *sk, u32 priority)
{
lock_sock(sk);
--
2.29.2
Powered by blists - more mailing lists