From nobody Mon Aug 24 01:42:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 978C51B87C9; Sun, 16 Aug 2026 01:00:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842049; cv=none; b=BxXLAf2w+Ec48W2RbJwj2vAP4/OGQOAE5Dm4x1PpNLSwQ8TlvopOwUBrcuUWAhaGiZuiOKabTbAb7fQ0M5EuS97BMGh1jTsWPzNzF+mqXpAEfMI5WMLV3YWHsQp0TPt4O30yUlAVAo3Qf+GQBF5nf1wyQ3mFtGX42rN3oiQAR6o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842049; c=relaxed/simple; bh=0gLLbCETGqIDMHTROtbKJGWQZ+BGog2ZU2IoJ1/V160=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y0lAZstf1BK8hBCwfn3VHKwaQM4+AOQzcaeJug+KZCp7bb2jSRjThtzzDILmBggiUhCGu7gFfE9MvPmjDQ0820IM3NPqoh277f+pQ3Q0XzazjbeJ9raThu2NSdxyxO5DpNFS764Kr6PumwtibxuDdV0nMd/q6m9lnrqeVKfOV1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=J6VYUGYk; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="J6VYUGYk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2D391F00A3A; Sun, 16 Aug 2026 01:00:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786842048; bh=yCcubPVYOzasxpeWtOUgFoT/f0kMOVIUWQrcf4APNck=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=J6VYUGYkRpSNzEahtVFMpW4zA0dAnRQmhIhNxQ5qLPtwdnEav5VV1TbcyUX4/z6Yh isfrNYYRM0DE6iiNDW42OxF6DFA6ju/4LCQbdaJqWKAnAml+SUgFDxXXaqq+WYvOw3 Semu5bwHy2q5TYqK73MMVLf3YVovz48kVMwHnogYN9C+tONibGKV/2Ou0Hwt/sfa8s cK+HqB+NAwyXGwkmdC6ldDdVvAFjjIF5xMxrE+k3y1osgOJMgmNN+cDs/ekDCEWGC4 gyt87Ta71klzKynqbW7l9//UEIF2dhnnlN1k0Bdcw1KBob+MAREjxBQrhNnEFs9leM nw/VMP42dLFMQ== From: Geliang Tang 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@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v3 1/4] nvmet-tcp: unify sockopt with do_sock_setsockopt Date: Sun, 16 Aug 2026 08:59:57 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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 --- drivers/nvme/target/tcp.c | 53 +++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 75a276d73be3..e64592b79257 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1696,10 +1696,48 @@ static void nvmet_tcp_state_change(struct sock *sk) read_unlock_bh(&sk->sk_callback_lock); } =20 +static void nvmet_tcp_sock_no_linger(struct sock *sk) +{ + struct linger ling =3D { .l_onoff =3D 1, .l_linger =3D 0 }; + + do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_LINGER, + KERNEL_SOCKPTR(&ling), sizeof(ling)); +} + +static void nvmet_tcp_sock_set_priority(struct sock *sk, u32 priority) +{ + do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_PRIORITY, + KERNEL_SOCKPTR(&priority), sizeof(priority)); +} + +static void nvmet_tcp_sock_set_reuseaddr(struct sock *sk) +{ + int val =3D SK_CAN_REUSE; + + do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_REUSEADDR, + KERNEL_SOCKPTR(&val), sizeof(val)); +} + +static void nvmet_tcp_sock_set_nodelay(struct sock *sk) +{ + int val =3D 1; + + do_sock_setsockopt(sk->sk_socket, false, SOL_TCP, TCP_NODELAY, + KERNEL_SOCKPTR(&val), sizeof(val)); +} + +static void nvmet_tcp_sock_set_tos(struct sock *sk) +{ + u8 tos =3D inet_sk(sk)->rcv_tos; + + if (tos > 0) + do_sock_setsockopt(sk->sk_socket, false, SOL_IP, IP_TOS, + KERNEL_SOCKPTR(&tos), sizeof(tos)); +} + static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue) { struct socket *sock =3D queue->sock; - struct inet_sock *inet =3D inet_sk(sock->sk); int ret; =20 ret =3D kernel_getsockname(sock, @@ -1717,14 +1755,13 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tc= p_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); + nvmet_tcp_sock_no_linger(sock->sk); =20 if (so_priority > 0) - sock_set_priority(sock->sk, so_priority); + nvmet_tcp_sock_set_priority(sock->sk, so_priority); =20 /* Set socket type of service */ - if (inet->rcv_tos > 0) - ip_sock_set_tos(sock->sk, inet->rcv_tos); + nvmet_tcp_sock_set_tos(sock->sk); =20 ret =3D 0; write_lock_bh(&sock->sk->sk_callback_lock); @@ -2098,10 +2135,10 @@ static int nvmet_tcp_add_port(struct nvmet_port *np= ort) port->sock->sk->sk_user_data =3D port; port->data_ready =3D port->sock->sk->sk_data_ready; port->sock->sk->sk_data_ready =3D nvmet_tcp_listen_data_ready; - sock_set_reuseaddr(port->sock->sk); - tcp_sock_set_nodelay(port->sock->sk); + nvmet_tcp_sock_set_reuseaddr(port->sock->sk); + nvmet_tcp_sock_set_nodelay(port->sock->sk); if (so_priority > 0) - sock_set_priority(port->sock->sk, so_priority); + nvmet_tcp_sock_set_priority(port->sock->sk, so_priority); =20 ret =3D kernel_bind(port->sock, (struct sockaddr_unsized *)&port->addr, sizeof(port->addr)); --=20 2.53.0 From nobody Mon Aug 24 01:42:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DA432279DC3; Sun, 16 Aug 2026 01:01:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842066; cv=none; b=RrZg6+V33VpjrURQhtxtvlUkn43lACZ6CgRnLZ+PCklBZVm/o8Fo3G0vDuWQjR3l3qE0Xg1jUjA0rQzP4llCU9qkSH9UAPFmfZoFI40W+Ohfs8AAbR0zIqmEllRx6Ze9w1J9L2kicHI3ejxZwx78jcv5RY6tzp9pfDsm4dJ9L48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842066; c=relaxed/simple; bh=UssxxIUH/KUZSgyH+QMNkudEWXRiRa2Xo0fwmc7xaC8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C/ZVJoBWUk0/iSkUuG+TQNQDRJLdvkDkgtP56GbXkoE9+sDEyuVg593DsLPDJim+Xt0OnXsEc2KvS5suNj9DSJFx/w3Zw8HY12ckex+PJdGOsqO6Mc/gH2VaukOe1QKQflYn/qIwiAU8TV2j9AwHddscQ200pHoeVXUItt2bDk4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bSM5fBhb; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bSM5fBhb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3815D1F000E9; Sun, 16 Aug 2026 01:00:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786842064; bh=7YtFNhH3aq+pBVyobarzrZt+vKIeq8cSqiWKG06sDFw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=bSM5fBhbA/EbbP2ity52Efrpr6QVWt92jSJ6knuJvwAeNPIGJ5pPMgfR35B8YgcRa cxJ2G68InMgUgFs5CF9tM0Y/Iqu/J3v/UNpoHzcYYiOV+SgoSY4uWo/oACJkBs3x7G eyvGkcmKf8pSjARwJG/Lkaj67YZz2yjffhbs+QX46s38B1QjD8S93s1A4qRS26dmdn Z+ucTsOC0iLoSgVMO8pF18/2OLb3V1Vyga9WWntJr4FZCZlyHNuEIzoBWF4pDQebch P6yh/SL/N4cI8Y0aQSn/3r4j9159mP7QnpwdJt6lgncwtVkrzFuIz2MiKY7rgW/ihu uIIGMPKnPoKFQ== From: Geliang Tang 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@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v3 2/4] nvme-tcp: unify sockopt with do_sock_setsockopt Date: Sun, 16 Aug 2026 08:59:58 +0800 Message-ID: <97e667df6c3755d1f9e2e709dfa1dc64903317e1.1786841319.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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 --- drivers/nvme/host/tcp.c | 55 +++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index ba5c7b3e2a7c..89a82e8248d2 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 *nctr= l, return ret; } =20 +static void nvme_tcp_sock_no_linger(struct sock *sk) +{ + struct linger ling =3D { .l_onoff =3D 1, .l_linger =3D 0 }; + + do_sock_setsockopt(sk->sk_socket, false, SOL_SOCKET, SO_LINGER, + KERNEL_SOCKPTR(&ling), sizeof(ling)); +} + +static void nvme_tcp_sock_set_priority(struct sock *sk, u32 priority) +{ + 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 void nvme_tcp_sock_set_nodelay(struct sock *sk) +{ + int val =3D 1; + + 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 void nvme_tcp_sock_set_tos(struct sock *sk, int tos) +{ + 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,24 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *n= ctrl, int qid, #endif =20 /* Single syn retry */ - tcp_sock_set_syncnt(queue->sock->sk, 1); + nvme_tcp_sock_set_syncnt(queue->sock->sk, 1); =20 /* Set TCP no delay */ - tcp_sock_set_nodelay(queue->sock->sk); + nvme_tcp_sock_set_nodelay(queue->sock->sk); =20 /* * 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); + nvme_tcp_sock_no_linger(queue->sock->sk); =20 if (so_priority > 0) - sock_set_priority(queue->sock->sk, so_priority); + nvme_tcp_sock_set_priority(queue->sock->sk, so_priority); =20 /* Set socket type of service */ if (nctrl->opts->tos >=3D 0) - ip_sock_set_tos(queue->sock->sk, nctrl->opts->tos); + nvme_tcp_sock_set_tos(queue->sock->sk, nctrl->opts->tos); =20 /* Set 10 seconds timeout for icresp recvmsg */ queue->sock->sk->sk_rcvtimeo =3D 10 * HZ; @@ -1864,10 +1905,8 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nc= trl, int qid, =20 if (nctrl->opts->mask & NVMF_OPT_HOST_IFACE) { char *iface =3D nctrl->opts->host_iface; - sockptr_t optval =3D KERNEL_SOCKPTR(iface); =20 - ret =3D sock_setsockopt(queue->sock, SOL_SOCKET, SO_BINDTODEVICE, - optval, strlen(iface)); + ret =3D 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", --=20 2.53.0 From nobody Mon Aug 24 01:42:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73BFD18C933; Sun, 16 Aug 2026 01:01:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842078; cv=none; b=aQr3W2rkZipn/26tjMcvPW/P6S9iLs4YfUqGfixUqAdVf9Gm/7PWolRwuz3x/ScrP9cl1/fME4XaUCvagC/xWOi9PiY3PvD3IzwBHV5rW1x0dE9zCBe8CR9d5X/FExAc9URG83W7UMlvSgcHgkv9rab72dOSJf/zdK6J3pzyqrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842078; c=relaxed/simple; bh=XMQbsP/XH9XBdepiOX8u0kubmj+K+svPOS/T6k91gb4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q3Q2tmVN2GxxKR0+jaNcb97/vo2aetyrCQ0LjAGqxViE2xew0P1KGRI6NmQoJfdQWCWyNvWC/RzmV1e7u/LF61vrepR9Q6uRYBrF7EyDX2CBb1pN8x9OHVDZ6xrjHrsquUhoRpRXHuJVk5eBFB66iT2LlY4CSFrlrQS7omeUkt0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IZzfWCN2; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IZzfWCN2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3B81B1F00A3A; Sun, 16 Aug 2026 01:01:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786842077; bh=RFXP0uhwAIzZtIngeZhsEQVAe4WY8w8ld85w5SPVvnQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=IZzfWCN26y/4FFAh3KmtR6wnGQfgSI7qLm8tekTQKMrp7pDLOYLGQieGL8fw+Kxoh f3rHL49Hzgg/XOzJGn1ETRU6I0MLipzLtLXr+qXiXw+pVkBBR6Shb16LtA8hV7tUAO BIlnCYcxdZNf1mYbxY0purE4aq8+NH3x8P19XFuCA+XFzDpXAv4o3zn1xur14snJ1+ TpLvLW8FL1kPptbwPJDOLBcZo3E777b02b4CUJtAi4y+5fmc+nvPMZJNXaMXuNBPby TsR7JUjLFd3TGu0lXS7fF9IVcJjV2nBrLTpMQ1TM+eZGekNLmBBOAYPb20bFCpxC35 asA0IsblR8RaA== From: Geliang Tang 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@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v3 3/4] nvmet-tcp: support IPv6 traffic class Date: Sun, 16 Aug 2026 08:59:59 +0800 Message-ID: <7d09c3211dfa76d536c7a30505cea6da626ee5e6.1786841319.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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 --- drivers/nvme/target/tcp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index e64592b79257..d34249cf3756 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1735,6 +1735,20 @@ static void nvmet_tcp_sock_set_tos(struct sock *sk) KERNEL_SOCKPTR(&tos), sizeof(tos)); } =20 +static void nvmet_tcp_sock_set_tclass(struct sock *sk) +{ +#if IS_ENABLED(CONFIG_IPV6) + if (sk->sk_family =3D=3D AF_INET6) { + u8 tclass =3D ip6_tclass(inet6_sk(sk)->rcv_flowinfo); + + if (tclass > 0) + do_sock_setsockopt(sk->sk_socket, false, SOL_IPV6, + IPV6_TCLASS, KERNEL_SOCKPTR(&tclass), + sizeof(tclass)); + } +#endif +} + static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue) { struct socket *sock =3D queue->sock; @@ -1762,6 +1776,7 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_= queue *queue) =20 /* Set socket type of service */ nvmet_tcp_sock_set_tos(sock->sk); + nvmet_tcp_sock_set_tclass(sock->sk); =20 ret =3D 0; write_lock_bh(&sock->sk->sk_callback_lock); --=20 2.53.0 From nobody Mon Aug 24 01:42:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D15A279DC3; Sun, 16 Aug 2026 01:01:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842088; cv=none; b=J9tHRpL9TyYgI1HszKYIgY/pmKyNL2xVBBF0EZ+Se28x7KLSJpkLDyKaLTDw6anqWSANwm6u19Zh3Ovc5w6nugzo0EIovQ+gjHpHVyt029vLBIVD5HksCGcN8cm5SzHd3nnqXvJOSHTxbueyuG3qO03Yf6YhWVSWzQcZ7dRxmdo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786842088; c=relaxed/simple; bh=zXDAcRDLBJrRg4o3QL9h9fE4Lo8nThxModYg1NaH38M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZoMcrqDmIXtFy38v56pNcmSPfUmPLXtYYuw1XemDO7pczemcHtydlnZz2JDVmkJdYPKEigfaFnAaNt0itUNsdXdS6OnDdOHHc9RSQNfeJ5U9VpyoN+8ANV6wDxayazay1/Di6F3OUk6ReDqvH6dQLWhMgEJa3AveQVECaw2TtSU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=czfC8R9y; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="czfC8R9y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB3381F000E9; Sun, 16 Aug 2026 01:01:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786842087; bh=M6/oWTjVc32MSJeTmKKP99yPQCYD/FPPYy/T9OozK4A=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=czfC8R9yOs75jdwhylZECirPrZ5LlFYiOGNl7SyrCzDk/hQEp49PzzjdZsoRTGwyK sxYe6s5mAAvklYBDo5JbOr2JWgxcQBd4Dp+v9Ysdq9Mf/ukqIvSROiEaH2eBoIHLQ8 uTbXbz/AO9VNVvCYqxlyy9i4zsrMP83e4ddibTA6P3dp8u5kGNH4n75ZCD2vMn1+7x dlrvIVmOXecnsyxGFX3OhRpNGy4i/oRa27+fanm0ZItA9lg+9zvn2EMcBUlSEF7QCd ja5wozZpXe67dMf7onmYXMRCTur+1KrmXKiSV809R/jUAEBR2On4VqOZ/fMGohj1We EVcPy66PeLaPA== From: Geliang Tang 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@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v3 4/4] nvme-tcp: support IPv6 traffic class Date: Sun, 16 Aug 2026 09:00:00 +0800 Message-ID: <52c4840e36ee6016d18806c2d205f4f9fdc1e830.1786841319.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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 --- drivers/nvme/host/tcp.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 89a82e8248d2..657acae9e4a4 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1815,6 +1815,15 @@ static void nvme_tcp_sock_set_tos(struct sock *sk, i= nt tos) KERNEL_SOCKPTR(&tos), sizeof(tos)); } =20 +static void nvme_tcp_sock_set_tclass(struct sock *sk, int tclass) +{ +#if IS_ENABLED(CONFIG_IPV6) + if (sk->sk_family =3D=3D AF_INET6) + do_sock_setsockopt(sk->sk_socket, false, SOL_IPV6, IPV6_TCLASS, + KERNEL_SOCKPTR(&tclass), sizeof(tclass)); +#endif +} + static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, key_serial_t pskid) { @@ -1876,8 +1885,10 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nc= trl, int qid, nvme_tcp_sock_set_priority(queue->sock->sk, so_priority); =20 /* Set socket type of service */ - if (nctrl->opts->tos >=3D 0) + if (nctrl->opts->tos >=3D 0) { nvme_tcp_sock_set_tos(queue->sock->sk, nctrl->opts->tos); + nvme_tcp_sock_set_tclass(queue->sock->sk, nctrl->opts->tos); + } =20 /* Set 10 seconds timeout for icresp recvmsg */ queue->sock->sk->sk_rcvtimeo =3D 10 * HZ; --=20 2.53.0