* [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt
2026-08-18 6:02 [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support Geliang Tang
@ 2026-08-18 6:03 ` Geliang Tang
2026-08-18 8:30 ` Hannes Reinecke
2026-08-19 9:04 ` Christoph Hellwig
2026-08-18 6:03 ` [PATCH v4 2/4] nvme-tcp: " Geliang Tang
` (3 subsequent siblings)
4 siblings, 2 replies; 10+ messages in thread
From: Geliang Tang @ 2026-08-18 6:03 UTC (permalink / raw)
To: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev
Cc: Geliang Tang, linux-nvme, netdev, mptcp
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch consolidates socket option settings in nvmet-tcp by utilizing
the generic do_sock_setsockopt() helper for options including SO_LINGER,
SO_PRIORITY, SO_REUSEADDR, TCP_NODELAY, and IP_TOS. This change eliminates
the need to export and use specialized helpers for each individual socket
option.
A key benefit of this refactoring is that it decouples the socket option
configuration from the underlying transport protocol. This makes it
easier to extend nvmet-tcp to support other protocols, such as MPTCP, in
the future, as do_sock_setsockopt() abstracts away protocol-specific
differences without requiring per-option protocol-specific wrappers.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
drivers/nvme/target/tcp.c | 82 ++++++++++++++++++++++++++++++++++-----
1 file changed, 72 insertions(+), 10 deletions(-)
diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
index 75a276d73be3..38b0c446ae89 100644
--- a/drivers/nvme/target/tcp.c
+++ b/drivers/nvme/target/tcp.c
@@ -1696,10 +1696,50 @@ static void nvmet_tcp_state_change(struct sock *sk)
read_unlock_bh(&sk->sk_callback_lock);
}
+static int nvmet_tcp_sock_no_linger(struct sock *sk)
+{
+ struct linger ling = { .l_onoff = 1, .l_linger = 0 };
+
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_LINGER,
+ KERNEL_SOCKPTR(&ling), sizeof(ling));
+}
+
+static int nvmet_tcp_sock_set_priority(struct sock *sk, u32 priority)
+{
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_PRIORITY,
+ KERNEL_SOCKPTR(&priority), sizeof(priority));
+}
+
+static int nvmet_tcp_sock_set_reuseaddr(struct sock *sk)
+{
+ int val = SK_CAN_REUSE;
+
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET,
+ SO_REUSEADDR, KERNEL_SOCKPTR(&val),
+ sizeof(val));
+}
+
+static int nvmet_tcp_sock_set_nodelay(struct sock *sk)
+{
+ int val = 1;
+
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_TCP, TCP_NODELAY,
+ KERNEL_SOCKPTR(&val), sizeof(val));
+}
+
+static int nvmet_tcp_sock_set_tos(struct sock *sk)
+{
+ int tos = inet_sk(sk)->rcv_tos;
+
+ if (tos > 0)
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_IP, IP_TOS,
+ KERNEL_SOCKPTR(&tos), sizeof(tos));
+ return 0;
+}
+
static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue)
{
struct socket *sock = queue->sock;
- struct inet_sock *inet = inet_sk(sock->sk);
int ret;
ret = kernel_getsockname(sock,
@@ -1717,14 +1757,20 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue)
* close. This is done to prevent stale data from being sent should
* the network connection be restored before TCP times out.
*/
- sock_no_linger(sock->sk);
+ ret = nvmet_tcp_sock_no_linger(sock->sk);
+ if (ret)
+ return ret;
- if (so_priority > 0)
- sock_set_priority(sock->sk, so_priority);
+ if (so_priority > 0) {
+ ret = nvmet_tcp_sock_set_priority(sock->sk, so_priority);
+ if (ret)
+ return ret;
+ }
/* Set socket type of service */
- if (inet->rcv_tos > 0)
- ip_sock_set_tos(sock->sk, inet->rcv_tos);
+ ret = nvmet_tcp_sock_set_tos(sock->sk);
+ if (ret)
+ return ret;
ret = 0;
write_lock_bh(&sock->sk->sk_callback_lock);
@@ -2098,10 +2144,26 @@ static int nvmet_tcp_add_port(struct nvmet_port *nport)
port->sock->sk->sk_user_data = port;
port->data_ready = port->sock->sk->sk_data_ready;
port->sock->sk->sk_data_ready = nvmet_tcp_listen_data_ready;
- sock_set_reuseaddr(port->sock->sk);
- tcp_sock_set_nodelay(port->sock->sk);
- if (so_priority > 0)
- sock_set_priority(port->sock->sk, so_priority);
+ ret = nvmet_tcp_sock_set_reuseaddr(port->sock->sk);
+ if (ret) {
+ pr_err("failed to set SO_REUSEADDR on port socket %d\n", ret);
+ goto err_sock;
+ }
+
+ ret = nvmet_tcp_sock_set_nodelay(port->sock->sk);
+ if (ret) {
+ pr_err("failed to set TCP_NODELAY on port socket %d\n", ret);
+ goto err_sock;
+ }
+
+ if (so_priority > 0) {
+ ret = nvmet_tcp_sock_set_priority(port->sock->sk, so_priority);
+ if (ret) {
+ pr_err("failed to set SO_PRIORITY on port socket %d\n",
+ ret);
+ goto err_sock;
+ }
+ }
ret = kernel_bind(port->sock, (struct sockaddr_unsized *)&port->addr,
sizeof(port->addr));
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt
2026-08-18 6:03 ` [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt Geliang Tang
@ 2026-08-18 8:30 ` Hannes Reinecke
2026-08-19 9:04 ` Christoph Hellwig
1 sibling, 0 replies; 10+ messages in thread
From: Hannes Reinecke @ 2026-08-18 8:30 UTC (permalink / raw)
To: Geliang Tang, Keith Busch, Jens Axboe, Christoph Hellwig,
Sagi Grimberg, Chaitanya Kulkarni, David Ahern, Ido Schimmel,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, Stanislav Fomichev
Cc: Geliang Tang, linux-nvme, netdev, mptcp
On 8/18/26 8:03 AM, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> This patch consolidates socket option settings in nvmet-tcp by utilizing
> the generic do_sock_setsockopt() helper for options including SO_LINGER,
> SO_PRIORITY, SO_REUSEADDR, TCP_NODELAY, and IP_TOS. This change eliminates
> the need to export and use specialized helpers for each individual socket
> option.
>
> A key benefit of this refactoring is that it decouples the socket option
> configuration from the underlying transport protocol. This makes it
> easier to extend nvmet-tcp to support other protocols, such as MPTCP, in
> the future, as do_sock_setsockopt() abstracts away protocol-specific
> differences without requiring per-option protocol-specific wrappers.
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> drivers/nvme/target/tcp.c | 82 ++++++++++++++++++++++++++++++++++-----
> 1 file changed, 72 insertions(+), 10 deletions(-)
>
Reviewed-by: Hannes Reinecke <hare@kernel.org>
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
hare@suse.de +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt
2026-08-18 6:03 ` [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt Geliang Tang
2026-08-18 8:30 ` Hannes Reinecke
@ 2026-08-19 9:04 ` Christoph Hellwig
2026-08-19 11:04 ` Breno Leitao
1 sibling, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2026-08-19 9:04 UTC (permalink / raw)
To: Geliang Tang
Cc: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev, Geliang Tang, linux-nvme,
netdev, mptcp, Breno Leitao
On Tue, Aug 18, 2026 at 02:03:00PM +0800, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> This patch consolidates socket option settings in nvmet-tcp by utilizing
> the generic do_sock_setsockopt() helper for options including SO_LINGER,
> SO_PRIORITY, SO_REUSEADDR, TCP_NODELAY, and IP_TOS. This change eliminates
> the need to export and use specialized helpers for each individual socket
> option.
Hmm. I see that do_sock_setsockopt is exported, but it really should
not be. It's really just an internal helper exposed for io_uring
and no modular code should be using it (never mind the non-GPL export).
> A key benefit of this refactoring is that it decouples the socket option
> configuration from the underlying transport protocol. This makes it
> easier to extend nvmet-tcp to support other protocols, such as MPTCP, in
> the future, as do_sock_setsockopt() abstracts away protocol-specific
> differences without requiring per-option protocol-specific wrappers.
We really should have generic helpers in the networking code for this
and not duplicate them in driver using socket options.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt
2026-08-19 9:04 ` Christoph Hellwig
@ 2026-08-19 11:04 ` Breno Leitao
2026-08-19 13:23 ` Breno Leitao
0 siblings, 1 reply; 10+ messages in thread
From: Breno Leitao @ 2026-08-19 11:04 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Geliang Tang, Keith Busch, Jens Axboe, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev, Geliang Tang, linux-nvme,
netdev, mptcp
On Wed, Aug 19, 2026 at 11:04:39AM +0200, Christoph Hellwig wrote:
> On Tue, Aug 18, 2026 at 02:03:00PM +0800, Geliang Tang wrote:
> > From: Geliang Tang <tanggeliang@kylinos.cn>
> >
> > This patch consolidates socket option settings in nvmet-tcp by utilizing
> > the generic do_sock_setsockopt() helper for options including SO_LINGER,
> > SO_PRIORITY, SO_REUSEADDR, TCP_NODELAY, and IP_TOS. This change eliminates
> > the need to export and use specialized helpers for each individual socket
> > option.
>
> Hmm. I see that do_sock_setsockopt is exported, but it really should
> not be. It's really just an internal helper exposed for io_uring
> and no modular code should be using it (never mind the non-GPL export).
Agreed. I am happy to remove the export, given it was introduced by my
change in commit 1406245c2945 ("net/socket: Break down
__sys_setsockopt")
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt
2026-08-19 11:04 ` Breno Leitao
@ 2026-08-19 13:23 ` Breno Leitao
0 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2026-08-19 13:23 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Geliang Tang, Keith Busch, Jens Axboe, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev, Geliang Tang, linux-nvme,
netdev, mptcp
On Wed, Aug 19, 2026 at 04:04:51AM -0700, Breno Leitao wrote:
> On Wed, Aug 19, 2026 at 11:04:39AM +0200, Christoph Hellwig wrote:
>
> Agreed. I am happy to remove the export, given it was introduced by my
> change in commit 1406245c2945 ("net/socket: Break down
> __sys_setsockopt")
Patch sent to net:
https://lore.kernel.org/all/20260819-hch_not_export-v1-1-af4b0de70e13@debian.org/
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v4 2/4] nvme-tcp: unify sockopt with do_sock_setsockopt
2026-08-18 6:02 [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support Geliang Tang
2026-08-18 6:03 ` [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt Geliang Tang
@ 2026-08-18 6:03 ` Geliang Tang
2026-08-18 6:03 ` [PATCH v4 3/4] nvmet-tcp: support IPv6 traffic class Geliang Tang
` (2 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2026-08-18 6:03 UTC (permalink / raw)
To: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev
Cc: Geliang Tang, linux-nvme, netdev, mptcp
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch consolidates socket option settings in nvme-tcp by utilizing
the generic do_sock_setsockopt() helper for options including SO_LINGER,
SO_PRIORITY, TCP_NODELAY, IP_TOS, SO_BINDTODEVICE, and TCP_SYNCNT.
Compared to the target-side implementation, this patch additionally
converts SO_BINDTODEVICE and TCP_SYNCNT to use the same unified mechanism.
This change eliminates the need to export and use specialized helpers for
each individual socket option.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
drivers/nvme/host/tcp.c | 91 ++++++++++++++++++++++++++++++++++++-----
1 file changed, 81 insertions(+), 10 deletions(-)
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index ba5c7b3e2a7c..025cade370b2 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1774,6 +1774,47 @@ static int nvme_tcp_start_tls(struct nvme_ctrl *nctrl,
return ret;
}
+static int nvme_tcp_sock_no_linger(struct sock *sk)
+{
+ struct linger ling = { .l_onoff = 1, .l_linger = 0 };
+
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_LINGER,
+ KERNEL_SOCKPTR(&ling), sizeof(ling));
+}
+
+static int nvme_tcp_sock_set_priority(struct sock *sk, u32 priority)
+{
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_PRIORITY,
+ KERNEL_SOCKPTR(&priority), sizeof(priority));
+}
+
+static int nvme_tcp_sock_set_bindtodevice(struct sock *sk, char *iface)
+{
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET,
+ SO_BINDTODEVICE, KERNEL_SOCKPTR(iface),
+ strlen(iface));
+}
+
+static int nvme_tcp_sock_set_nodelay(struct sock *sk)
+{
+ int val = 1;
+
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_TCP, TCP_NODELAY,
+ KERNEL_SOCKPTR(&val), sizeof(val));
+}
+
+static int nvme_tcp_sock_set_syncnt(struct sock *sk, int val)
+{
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_TCP, TCP_SYNCNT,
+ KERNEL_SOCKPTR(&val), sizeof(val));
+}
+
+static int nvme_tcp_sock_set_tos(struct sock *sk, int tos)
+{
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_IP, IP_TOS,
+ KERNEL_SOCKPTR(&tos), sizeof(tos));
+}
+
static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,
key_serial_t pskid)
{
@@ -1819,24 +1860,56 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,
#endif
/* Single syn retry */
- tcp_sock_set_syncnt(queue->sock->sk, 1);
+ ret = nvme_tcp_sock_set_syncnt(queue->sock->sk, 1);
+ if (ret) {
+ dev_err(nctrl->device,
+ "failed to set TCP_SYNCNT on queue %d err %d\n",
+ qid, ret);
+ goto err_sock;
+ }
/* Set TCP no delay */
- tcp_sock_set_nodelay(queue->sock->sk);
+ ret = nvme_tcp_sock_set_nodelay(queue->sock->sk);
+ if (ret) {
+ dev_err(nctrl->device,
+ "failed to set TCP_NODELAY on queue %d err %d\n",
+ qid, ret);
+ goto err_sock;
+ }
/*
* Cleanup whatever is sitting in the TCP transmit queue on socket
* close. This is done to prevent stale data from being sent should
* the network connection be restored before TCP times out.
*/
- sock_no_linger(queue->sock->sk);
+ ret = nvme_tcp_sock_no_linger(queue->sock->sk);
+ if (ret) {
+ dev_err(nctrl->device,
+ "failed to set SO_LINGER on queue %d err %d\n",
+ qid, ret);
+ goto err_sock;
+ }
- if (so_priority > 0)
- sock_set_priority(queue->sock->sk, so_priority);
+ if (so_priority > 0) {
+ ret = nvme_tcp_sock_set_priority(queue->sock->sk, so_priority);
+ if (ret) {
+ dev_err(nctrl->device,
+ "failed to set SO_PRIORITY on queue %d err %d\n",
+ qid, ret);
+ goto err_sock;
+ }
+ }
/* Set socket type of service */
- if (nctrl->opts->tos >= 0)
- ip_sock_set_tos(queue->sock->sk, nctrl->opts->tos);
+ if (nctrl->opts->tos >= 0) {
+ ret = nvme_tcp_sock_set_tos(queue->sock->sk, nctrl->opts->tos);
+ if (ret) {
+ dev_err(nctrl->device,
+ "failed to set IP_TOS on queue %d err %d\n",
+ qid, ret);
+ goto err_sock;
+ }
+ }
/* Set 10 seconds timeout for icresp recvmsg */
queue->sock->sk->sk_rcvtimeo = 10 * HZ;
@@ -1864,10 +1937,8 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,
if (nctrl->opts->mask & NVMF_OPT_HOST_IFACE) {
char *iface = nctrl->opts->host_iface;
- sockptr_t optval = KERNEL_SOCKPTR(iface);
- ret = sock_setsockopt(queue->sock, SOL_SOCKET, SO_BINDTODEVICE,
- optval, strlen(iface));
+ ret = nvme_tcp_sock_set_bindtodevice(queue->sock->sk, iface);
if (ret) {
dev_err(nctrl->device,
"failed to bind to interface %s queue %d err %d\n",
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v4 3/4] nvmet-tcp: support IPv6 traffic class
2026-08-18 6:02 [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support Geliang Tang
2026-08-18 6:03 ` [PATCH v4 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt Geliang Tang
2026-08-18 6:03 ` [PATCH v4 2/4] nvme-tcp: " Geliang Tang
@ 2026-08-18 6:03 ` Geliang Tang
2026-08-18 6:03 ` [PATCH v4 4/4] nvme-tcp: " Geliang Tang
2026-08-18 7:14 ` [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support MPTCP CI
4 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2026-08-18 6:03 UTC (permalink / raw)
To: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev
Cc: Geliang Tang, linux-nvme, netdev, mptcp
From: Geliang Tang <tanggeliang@kylinos.cn>
Currently, nvmet-tcp only applies the received IPv4 TOS value when setting
up a queue socket, but does not handle the IPv6 traffic class.
Extend the queue socket setup to handle AF_INET6 sockets. Obtain the
traffic class from the IPv6 socket's rcv_flowinfo and apply it through
IPV6_TCLASS using do_sock_setsockopt().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
drivers/nvme/target/tcp.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
index 38b0c446ae89..ed413aa5601c 100644
--- a/drivers/nvme/target/tcp.c
+++ b/drivers/nvme/target/tcp.c
@@ -1737,6 +1737,22 @@ static int nvmet_tcp_sock_set_tos(struct sock *sk)
return 0;
}
+static int nvmet_tcp_sock_set_tclass(struct sock *sk)
+{
+#if IS_ENABLED(CONFIG_IPV6)
+ if (sk->sk_family == AF_INET6) {
+ int tclass = ip6_tclass(inet6_sk(sk)->rcv_flowinfo);
+
+ if (tclass > 0)
+ return do_sock_setsockopt(sk->sk_socket, false,
+ SOL_IPV6, IPV6_TCLASS,
+ KERNEL_SOCKPTR(&tclass),
+ sizeof(tclass));
+ }
+#endif
+ return 0;
+}
+
static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue)
{
struct socket *sock = queue->sock;
@@ -1772,6 +1788,10 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue)
if (ret)
return ret;
+ ret = nvmet_tcp_sock_set_tclass(sock->sk);
+ if (ret)
+ return ret;
+
ret = 0;
write_lock_bh(&sock->sk->sk_callback_lock);
if (sock->sk->sk_state != TCP_ESTABLISHED) {
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v4 4/4] nvme-tcp: support IPv6 traffic class
2026-08-18 6:02 [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support Geliang Tang
` (2 preceding siblings ...)
2026-08-18 6:03 ` [PATCH v4 3/4] nvmet-tcp: support IPv6 traffic class Geliang Tang
@ 2026-08-18 6:03 ` Geliang Tang
2026-08-18 7:14 ` [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support MPTCP CI
4 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2026-08-18 6:03 UTC (permalink / raw)
To: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
Chaitanya Kulkarni, David Ahern, Ido Schimmel, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
Hannes Reinecke, Stanislav Fomichev
Cc: Geliang Tang, linux-nvme, netdev, mptcp
From: Geliang Tang <tanggeliang@kylinos.cn>
Currently, nvme-tcp host only supports setting the IPv4 TOS value when a
TOS is specified, but does not handle the IPv6 traffic class.
Extend the queue socket setup to handle AF_INET6 sockets by applying the
TOS value to both IPv4 and IPv6 sockets. For IPv6, the TOS value is set
as the IPv6 traffic class via IPV6_TCLASS using do_sock_setsockopt().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
drivers/nvme/host/tcp.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index 025cade370b2..5f30be04a9dd 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1815,6 +1815,17 @@ static int nvme_tcp_sock_set_tos(struct sock *sk, int tos)
KERNEL_SOCKPTR(&tos), sizeof(tos));
}
+static int nvme_tcp_sock_set_tclass(struct sock *sk, int tclass)
+{
+#if IS_ENABLED(CONFIG_IPV6)
+ if (sk->sk_family == AF_INET6)
+ return do_sock_setsockopt(sk->sk_socket, false, SOL_IPV6,
+ IPV6_TCLASS, KERNEL_SOCKPTR(&tclass),
+ sizeof(tclass));
+#endif
+ return 0;
+}
+
static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,
key_serial_t pskid)
{
@@ -1909,6 +1920,15 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,
qid, ret);
goto err_sock;
}
+
+ ret = nvme_tcp_sock_set_tclass(queue->sock->sk,
+ nctrl->opts->tos);
+ if (ret) {
+ dev_err(nctrl->device,
+ "failed to set IPV6_TCLASS on queue %d err %d\n",
+ qid, ret);
+ goto err_sock;
+ }
}
/* Set 10 seconds timeout for icresp recvmsg */
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support
2026-08-18 6:02 [PATCH v4 0/4] nvme-tcp: add IPv6 traffic class support Geliang Tang
` (3 preceding siblings ...)
2026-08-18 6:03 ` [PATCH v4 4/4] nvme-tcp: " Geliang Tang
@ 2026-08-18 7:14 ` MPTCP CI
4 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2026-08-18 7:14 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal (except selftest_mptcp_join): Success! ✅
- KVM Validation: normal (only selftest_mptcp_join): Success! ✅
- KVM Validation: debug (except selftest_mptcp_join): Success! ✅
- KVM Validation: debug (only selftest_mptcp_join): Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/32107026013
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/0547cdad1bc1
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1147565
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-normal
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
^ permalink raw reply [flat|nested] 10+ messages in thread