From: Daniel Wagner <dwagner@suse.de> To: linux-nvme@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Daniel Wagner <dwagner@suse.de> Subject: [RFC v1] nvme-tcp: enable linger socket option on shutdown Date: Fri, 3 Sep 2021 14:17:57 +0200 [thread overview] Message-ID: <20210903121757.140357-1-dwagner@suse.de> (raw) 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@suse.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
WARNING: multiple messages have this Message-ID (diff)
From: Daniel Wagner <dwagner@suse.de> To: linux-nvme@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Daniel Wagner <dwagner@suse.de> Subject: [RFC v1] nvme-tcp: enable linger socket option on shutdown Date: Fri, 3 Sep 2021 14:17:57 +0200 [thread overview] Message-ID: <20210903121757.140357-1-dwagner@suse.de> (raw) 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@suse.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 _______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme
next reply other threads:[~2021-09-03 12:18 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-09-03 12:17 Daniel Wagner [this message] 2021-09-03 12:17 ` [RFC v1] nvme-tcp: enable linger socket option on shutdown Daniel Wagner 2021-09-06 7:58 ` Christoph Hellwig 2021-09-06 7:58 ` Christoph Hellwig 2021-09-14 8:46 ` Daniel Wagner 2021-09-14 8:46 ` Daniel Wagner 2021-09-14 14:20 ` Sagi Grimberg 2021-09-14 14:20 ` Sagi Grimberg 2021-09-15 7:54 ` Daniel Wagner 2021-09-15 7:54 ` Daniel Wagner
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210903121757.140357-1-dwagner@suse.de \ --to=dwagner@suse.de \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-nvme@lists.infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.