From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5E79C1E2614 for ; Mon, 9 Feb 2026 09:04:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627875; cv=none; b=m6hdQO+pU5Z0rQPhKc5yKVQb+8LLlDIg6bAPd6CH9fe0vVoUCfeW1uu7Lho0i2/jwAmjyj+/2fWmRo0erdXdTaKwBMSkOCwC2N3utgS+ES8N3RK4l6Mk8qwr04QLjMWAuQBWLz2V9V1mFgNNaoGjs13i3egZWq7ol96e0CJ/I9M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627875; c=relaxed/simple; bh=5wAqg4Y76q9Vqv/QfZpGMwdsak39VQtYVPozE4uN6y0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XPMA3zF79wDtsITmAgRyErbOqZ8iFOIYVTsygm04YJDXK8jkMOXAwdIL56kEVRuPVIIBFeCVnvSVFJkdJoHIpbNEoGZYGwAoiPaoR5x4YWo45gfednl+m5sfFbICyTTMbTkPPDmXit/UDAeL+vmDCmHrkdquBITCCZ2dB6krMEM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=q/9u4OKX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="q/9u4OKX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09752C116C6; Mon, 9 Feb 2026 09:04:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627875; bh=5wAqg4Y76q9Vqv/QfZpGMwdsak39VQtYVPozE4uN6y0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=q/9u4OKXXjPJAH6sILO5MqcjON7u+7RM4DceLddolBLSCFj1mPZsboK/qvcPEz9MQ MaqptQBPWIRT5AnQHpDKAyfGVgbDNJ5NJZT5QK30J8ERxy0pTm8kaRV63Ja3c9XabN LJf5/5qKXpo9IL+6vq1Jm+w3Lra4Np+CtzphDj7Bft4eUwhuldGpZAPdAcESIwwvDq FYCGgOS7/K906sFZn31Srl5wMDu2bEk1SHywUa90Sojpqq9t+e6COWw0kYYul+mcq0 GHWYyy3r8AbuMBImEqTP7uAu9TJWhlxJiTvlTewPA6zRZEAVqEdkJyQnNrkP+y2A6v zqqe+9nHrYQdA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [RFC mptcp-next v3 1/7] mptcp: add sk_is_msk helper Date: Mon, 9 Feb 2026 17:04:16 +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 introduces a sk_is_msk() helper modeled after sk_is_tcp() to determine whether the socket is an MPTCP one. Unlike sk_is_mptcp(), which accepts a subflow socket as its parameter, this new helper specifically accepts an MPTCP socket parameter. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 4cf59e83c1c5..82660374859a 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -150,6 +150,13 @@ static inline bool rsk_drop_req(const struct request_s= ock *req) return tcp_rsk(req)->is_mptcp && tcp_rsk(req)->drop_req; } =20 +static inline bool sk_is_msk(const struct sock *sk) +{ + return sk_is_inet(sk) && + sk->sk_type =3D=3D SOCK_STREAM && + sk->sk_protocol =3D=3D IPPROTO_MPTCP; +} + void mptcp_space(const struct sock *ssk, int *space, int *full_space); bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb, unsigned int *size, struct mptcp_out_options *opts); @@ -258,6 +265,11 @@ static inline bool rsk_drop_req(const struct request_s= ock *req) return false; } =20 +static inline bool sk_is_msk(const struct sock *sk) +{ + return false; +} + static inline bool mptcp_syn_options(struct sock *sk, const struct sk_buff= *skb, unsigned int *size, struct mptcp_out_options *opts) --=20 2.53.0 From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D2D701E2614 for ; Mon, 9 Feb 2026 09:04:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627877; cv=none; b=npQOEhuZFKXJd/orPYvDDwmhUIMebxeMQZt1UvoJwsz3M3jqXb7iGIy1srutoXjqMzr30039cfVE2hZHvDwdZteJaND94vjf6lO1B2r/f4RchwwiApoHHeUQzGYFiEtykgKtSd9bhwnte7kASz67emd1aKWuoKOYdSVI8/qT/YA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627877; c=relaxed/simple; bh=X4fEE1PChLgXdu8iEmQ73jdE/2gExo0lCvadVdIH0s4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oqZsRNh9e+1D8DCOZB4+NShH6O5ISUpuDjCGdu6HZrrxorTXL/Ab4iPBKqK2G2iv/yh/MyjStCkCc6uznaInLw4rCMVjM/KJhn6oZe8OEJKB/qrXItPYqdqxxKxIXQqP6KsE/E7Gls+6yrl39YtCQ/i8zDcykZevMUyL/ni6Lp8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=b6yfhjqg; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="b6yfhjqg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9868CC116C6; Mon, 9 Feb 2026 09:04:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627877; bh=X4fEE1PChLgXdu8iEmQ73jdE/2gExo0lCvadVdIH0s4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b6yfhjqgH1trPakYOZhMkDHIyv6msU8xx5jo2ZXZyI59d3Skk2FY0G8SEvU1c8P9R bGUywhcwd5lugT3wlfzz2HWk+ELxzepJsYo8f1ayr5jWI8IKeKOYGU86DnfTmzfS9B pRqTAGWZWlpDS1CoOC0bW4PqrvfO5xjQJMh7WwVCABnJRsgtnAZ0CYwdUifViScF6B yaMSNuk2OAa/qtuaFOtfh3EZRxRJb2GqU0/qfcicn4TgUtvSZng9EZaVZEDYMv9mrd 7/1N99/dOoF0CrdYDrlrz0/Xb6oIPKvKb1AE5bJgR2MGw6Xvj6Q1bdF1IUUyoKKWKL x+SHHy9wo0VLQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , Hannes Reinecke , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v3 2/7] nvmet-tcp: add mptcp support Date: Mon, 9 Feb 2026 17:04:17 +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 adds a new nvme target transport type NVMF_TRTYPE_MPTCP for MPTCP. And defines a new nvmet_fabrics_ops named nvmet_mptcp_ops, which is almost the same as nvmet_tcp_ops except .type. Check if disc_addr.trtype is NVMF_TRTYPE_MPTCP in nvmet_tcp_add_port() to decide whether to pass IPPROTO_MPTCP to sock_create() to create a MPTCP socket instead of a TCP one. This new nvmet_fabrics_ops can be switched in nvmet_tcp_done_recv_pdu() according to different protocol. v2: - use trtype instead of tsas (Hannes). v3: - check mptcp protocol from disc_addr.trtype instead of passing a parameter (Hannes). v4: - check CONFIG_MPTCP. Cc: Hannes Reinecke Co-developed-by: zhenwei pi Signed-off-by: zhenwei pi Co-developed-by: Hui Zhu Signed-off-by: Hui Zhu Co-developed-by: Gang Yan Signed-off-by: Gang Yan Signed-off-by: Geliang Tang --- drivers/nvme/target/configfs.c | 1 + drivers/nvme/target/tcp.c | 34 ++++++++++++++++++++++++++++++++-- include/linux/nvme.h | 1 + 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index e44ef69dffc2..14c642cd458e 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -37,6 +37,7 @@ static struct nvmet_type_name_map nvmet_transport[] =3D { { NVMF_TRTYPE_RDMA, "rdma" }, { NVMF_TRTYPE_FC, "fc" }, { NVMF_TRTYPE_TCP, "tcp" }, + { NVMF_TRTYPE_MPTCP, "mptcp" }, { NVMF_TRTYPE_PCI, "pci" }, { NVMF_TRTYPE_LOOP, "loop" }, }; diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 549a4786d1c3..05718103649b 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -212,6 +212,7 @@ static DEFINE_MUTEX(nvmet_tcp_queue_mutex); =20 static struct workqueue_struct *nvmet_tcp_wq; static const struct nvmet_fabrics_ops nvmet_tcp_ops; +static const struct nvmet_fabrics_ops nvmet_mptcp_ops; static void nvmet_tcp_free_cmd(struct nvmet_tcp_cmd *c); static void nvmet_tcp_free_cmd_buffers(struct nvmet_tcp_cmd *cmd); =20 @@ -1051,7 +1052,9 @@ static int nvmet_tcp_done_recv_pdu(struct nvmet_tcp_q= ueue *queue) req =3D &queue->cmd->req; memcpy(req->cmd, nvme_cmd, sizeof(*nvme_cmd)); =20 - if (unlikely(!nvmet_req_init(req, &queue->nvme_sq, &nvmet_tcp_ops))) { + if (unlikely(!nvmet_req_init(req, &queue->nvme_sq, + sk_is_msk(queue->sock->sk) ? + &nvmet_mptcp_ops : &nvmet_tcp_ops))) { pr_err("failed cmd %p id %d opcode %d, data_len: %d, status: %04x\n", req->cmd, req->cmd->common.command_id, req->cmd->common.opcode, @@ -2018,6 +2021,7 @@ static int nvmet_tcp_add_port(struct nvmet_port *npor= t) { struct nvmet_tcp_port *port; __kernel_sa_family_t af; + int proto =3D IPPROTO_TCP; int ret; =20 port =3D kzalloc(sizeof(*port), GFP_KERNEL); @@ -2038,6 +2042,11 @@ static int nvmet_tcp_add_port(struct nvmet_port *npo= rt) goto err_port; } =20 +#ifdef CONFIG_MPTCP + if (nport->disc_addr.trtype =3D=3D NVMF_TRTYPE_MPTCP) + proto =3D IPPROTO_MPTCP; +#endif + ret =3D inet_pton_with_scope(&init_net, af, nport->disc_addr.traddr, nport->disc_addr.trsvcid, &port->addr); if (ret) { @@ -2052,7 +2061,7 @@ static int nvmet_tcp_add_port(struct nvmet_port *npor= t) port->nport->inline_data_size =3D NVMET_TCP_DEF_INLINE_DATA_SIZE; =20 ret =3D sock_create(port->addr.ss_family, SOCK_STREAM, - IPPROTO_TCP, &port->sock); + proto, &port->sock); if (ret) { pr_err("failed to create a socket\n"); goto err_port; @@ -2204,6 +2213,19 @@ static const struct nvmet_fabrics_ops nvmet_tcp_ops = =3D { .host_traddr =3D nvmet_tcp_host_port_addr, }; =20 +static const struct nvmet_fabrics_ops nvmet_mptcp_ops =3D { + .owner =3D THIS_MODULE, + .type =3D NVMF_TRTYPE_MPTCP, + .msdbd =3D 1, + .add_port =3D nvmet_tcp_add_port, + .remove_port =3D nvmet_tcp_remove_port, + .queue_response =3D nvmet_tcp_queue_response, + .delete_ctrl =3D nvmet_tcp_delete_ctrl, + .install_queue =3D nvmet_tcp_install_queue, + .disc_traddr =3D nvmet_tcp_disc_port_addr, + .host_traddr =3D nvmet_tcp_host_port_addr, +}; + static int __init nvmet_tcp_init(void) { int ret; @@ -2217,6 +2239,12 @@ static int __init nvmet_tcp_init(void) if (ret) goto err; =20 + ret =3D nvmet_register_transport(&nvmet_mptcp_ops); + if (ret) { + nvmet_unregister_transport(&nvmet_tcp_ops); + goto err; + } + return 0; err: destroy_workqueue(nvmet_tcp_wq); @@ -2227,6 +2255,7 @@ static void __exit nvmet_tcp_exit(void) { struct nvmet_tcp_queue *queue; =20 + nvmet_unregister_transport(&nvmet_mptcp_ops); nvmet_unregister_transport(&nvmet_tcp_ops); =20 flush_workqueue(nvmet_wq); @@ -2246,3 +2275,4 @@ module_exit(nvmet_tcp_exit); MODULE_DESCRIPTION("NVMe target TCP transport driver"); MODULE_LICENSE("GPL v2"); MODULE_ALIAS("nvmet-transport-3"); /* 3 =3D=3D NVMF_TRTYPE_TCP */ +MODULE_ALIAS("nvmet-transport-4"); /* 4 =3D=3D NVMF_TRTYPE_MPTCP */ diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 655d194f8e72..8069667ad47e 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -68,6 +68,7 @@ enum { NVMF_TRTYPE_RDMA =3D 1, /* RDMA */ NVMF_TRTYPE_FC =3D 2, /* Fibre Channel */ NVMF_TRTYPE_TCP =3D 3, /* TCP/IP */ + NVMF_TRTYPE_MPTCP =3D 4, /* Multipath TCP */ NVMF_TRTYPE_LOOP =3D 254, /* Reserved for host usage */ NVMF_TRTYPE_MAX, }; --=20 2.53.0 From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2BB681E2614 for ; Mon, 9 Feb 2026 09:04:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627881; cv=none; b=CdD4ImT0GKglMt6ghm/NsRikEjbQqtwv+QvRYNi/e1irIj//eSjoQkj5JQMmqw4rQ8C2GAjASvr3JDPHOY8WKNN48z1jVApCEa8Z32/GHXuKGDa2ejklimbyT0Zddn0EweCSJUJOnAXEdtwsc6ynrfnr8tLC/kZKdu9gpqo71g4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627881; c=relaxed/simple; bh=cBgIGIaEflD5zbb38kAq9jssbnmmvqbY+gJOlYv96Ms=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jjGgm/2Jx8YRMBgRoHWDdGzPLV71JhAaH3yM7O/CaHoOHYnBmGF9PEqTT2kTYe2cPcbpGSY9oRh6TK1aGxcnKWHotc4QvP1VQchn9Xfuj3zxP3iFbbrNdJp2WLzWTM62VcMZ0+E76TwFjGytt4RzDexUmz2Q2fkmmEvwo+Q/E4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ALhuTP+l; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ALhuTP+l" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B501C19424; Mon, 9 Feb 2026 09:04:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627881; bh=cBgIGIaEflD5zbb38kAq9jssbnmmvqbY+gJOlYv96Ms=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ALhuTP+l3wuu7OJYSP+jn3f6reNXZBcANH2qUoYYCDeWHGHO6aBVWPGh7DGd3pLh2 PLszc3/mjC4alxFCf8hxzP0hUNwou7515jyd61cutKlpi6lhgqI65HdEsXz+f493L/ WzqPf5AbTDpCaWZZz6H6Rb/q+IDCkBr1vLaeJC3QXGlM1164Mb+4MJiDm9RRQUFiq0 gDSsLXJQjIIQcl26FPzYAUM08ey3LnILmiIOD4dLIs43miY2ggNQ/+a82/OD37cAee K6XlxhXPRSHX8iOXrShqkfrNWNvCUPoeC4JkcbW8SGkP7R5QBENCg0RQ4C5QIbjRUM b9sx7oA6oMyOw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , Hannes Reinecke , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v3 3/7] nvme-tcp: add mptcp support Date: Mon, 9 Feb 2026 17:04:18 +0800 Message-ID: <069016b5f65def8677de09c4ce750ebad3ac1ca8.1770627071.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 defines a new nvmf_transport_ops named nvme_mptcp_transport, which is almost the same as nvme_tcp_transport except .type. Check if opts->transport is "mptcp" in nvme_tcp_alloc_queue() to decide whether to pass IPPROTO_MPTCP to sock_create_kern() to create a MPTCP socket instead of a TCP one. v2: - use 'trtype' instead of '--mptcp' (Hannes) v3: - check mptcp protocol from opts->transport instead of passing a parameter (Hannes). v4: - check CONFIG_MPTCP. Cc: Hannes Reinecke Co-developed-by: zhenwei pi Signed-off-by: zhenwei pi Co-developed-by: Hui Zhu Signed-off-by: Hui Zhu Co-developed-by: Gang Yan Signed-off-by: Gang Yan Signed-off-by: Geliang Tang --- drivers/nvme/host/tcp.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 69cb04406b47..40d96a77618a 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1766,6 +1766,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nct= rl, int qid, { struct nvme_tcp_ctrl *ctrl =3D to_tcp_ctrl(nctrl); struct nvme_tcp_queue *queue =3D &ctrl->queues[qid]; + int proto =3D IPPROTO_TCP; int ret, rcv_pdu_size; struct file *sock_file; =20 @@ -1782,9 +1783,14 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nc= trl, int qid, queue->cmnd_capsule_len =3D sizeof(struct nvme_command) + NVME_TCP_ADMIN_CCSZ; =20 +#ifdef CONFIG_MPTCP + if (!strcmp(ctrl->ctrl.opts->transport, "mptcp")) + proto =3D IPPROTO_MPTCP; +#endif + ret =3D sock_create_kern(current->nsproxy->net_ns, ctrl->addr.ss_family, SOCK_STREAM, - IPPROTO_TCP, &queue->sock); + proto, &queue->sock); if (ret) { dev_err(nctrl->device, "failed to create socket: %d\n", ret); @@ -3023,6 +3029,18 @@ static struct nvmf_transport_ops nvme_tcp_transport = =3D { .create_ctrl =3D nvme_tcp_create_ctrl, }; =20 +static struct nvmf_transport_ops nvme_mptcp_transport =3D { + .name =3D "mptcp", + .module =3D THIS_MODULE, + .required_opts =3D NVMF_OPT_TRADDR, + .allowed_opts =3D NVMF_OPT_TRSVCID | NVMF_OPT_RECONNECT_DELAY | + NVMF_OPT_HOST_TRADDR | NVMF_OPT_CTRL_LOSS_TMO | + NVMF_OPT_HDR_DIGEST | NVMF_OPT_DATA_DIGEST | + NVMF_OPT_NR_WRITE_QUEUES | NVMF_OPT_NR_POLL_QUEUES | + NVMF_OPT_TOS | NVMF_OPT_HOST_IFACE, + .create_ctrl =3D nvme_tcp_create_ctrl, +}; + static int __init nvme_tcp_init_module(void) { unsigned int wq_flags =3D WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_SYSFS; @@ -3048,6 +3066,7 @@ static int __init nvme_tcp_init_module(void) atomic_set(&nvme_tcp_cpu_queues[cpu], 0); =20 nvmf_register_transport(&nvme_tcp_transport); + nvmf_register_transport(&nvme_mptcp_transport); return 0; } =20 @@ -3055,6 +3074,7 @@ static void __exit nvme_tcp_cleanup_module(void) { struct nvme_tcp_ctrl *ctrl; =20 + nvmf_unregister_transport(&nvme_mptcp_transport); nvmf_unregister_transport(&nvme_tcp_transport); =20 mutex_lock(&nvme_tcp_ctrl_mutex); --=20 2.53.0 From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 3ED4D32693C for ; Mon, 9 Feb 2026 09:04:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627884; cv=none; b=RyCstcGvvcJ0tfWw7t2jX7zw11s5NU/y6oV69q6B1IZd552wVwgbTciVSMpjZWO5ZDP8L2lGOT8UJncHydzNGSxCOvCAYhS95FV/xTYtVUkWxvu7i3s8xHqq7tuadWUSy71MJ45Sm98JAqH9KHunqDf9S080k4iZMms8YkwtdAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627884; c=relaxed/simple; bh=o7WBTFm0ga9ohCpVftjxE/9pYvs1PqJHdLZao8nnits=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EnXL8hm0TkOVLpELBnHPqjVwYdj/C7e5yw0YpqjpsgTCw+1YZvocF1WiB0O7VEHOQQKbmwSSrpFWzeFGGbs3iJDu8LO4+YIA7SekfGcCCN6Hm98yP/PxDAT0bbwGmHynoIB5mHUkzMNxUPxJMa55UG1OMUzo3jLrthv3H+thghM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CSj6yNuR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CSj6yNuR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A2989C19424; Mon, 9 Feb 2026 09:04:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627883; bh=o7WBTFm0ga9ohCpVftjxE/9pYvs1PqJHdLZao8nnits=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CSj6yNuR5xeJqKQflgWZb1ENLR3SXV7c+Sqprp4FGhOYy048v0t/IcKJ+OuKf3NJS bZz+d0R8GXrymCsQubDNBg/YV/yBy+GeB/n0uiZuLf9BM/NTU6tvlne+fhRwUbD4hP no5AmQwF5Be8h3m/kwJyeyHFRnbzrNrp+Wr4mMcDW6kd1h7vrABiDGasdcNCi0sQFC /hfs2gS4IIsSZ9z968netqROrI8zubtGFivsD7oQemPKOtJPMNJzFI+oXW/hzfeCYG ovyKInvjBYkTmH4s5qarpRmPRGyvOhkmhwgXlgRI0PX8baL6Nn42SyWb8u7DxOnQIk kYLgzVuDpTcKA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v3 4/7] mptcp: add sock_set_nodelay Date: Mon, 9 Feb 2026 17:04:19 +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 introduces an MPTCP-specific helper, mptcp_sock_set_nodelay, which sets the TCP_NODELAY option for every subflow socket within an MPTCP connection. It is utilized on both the target and host sides in the 'NVMe over MPTCP' implementation. Using tcp_sock_set_nodelay() with MPTCP will cause list corruption: nvmet: adding nsid 1 to subsystem nqn.2014-08.org.nvmexpress.mptcpdev nvmet_tcp: enabling port 1234 (127.0.0.1:4420) slab MPTCP start ffff8880108f0b80 pointer offset 2480 size 2816 list_add corruption. prev->next should be next (ffff8880108f1530), but was ffff8885108f1530. (prev=3Dffff8880108f1530). ------------[ cut here ]------------ kernel BUG at lib/list_debug.c:32! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 1 UID: 0 PID: 182 Comm: nvme Not tainted 6.16.0-rc3+ #1 PREEMPT(full) Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 Co-developed-by: zhenwei pi Signed-off-by: zhenwei pi Co-developed-by: Hui Zhu Signed-off-by: Hui Zhu Co-developed-by: Gang Yan Signed-off-by: Gang Yan Signed-off-by: Geliang Tang --- drivers/nvme/host/tcp.c | 2 ++ drivers/nvme/target/tcp.c | 2 ++ include/net/mptcp.h | 4 ++++ net/mptcp/protocol.c | 17 +++++++++++++++++ 4 files changed, 25 insertions(+) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 40d96a77618a..6188e01b85db 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1810,6 +1810,8 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nct= rl, int qid, tcp_sock_set_syncnt(queue->sock->sk, 1); =20 /* Set TCP no delay */ + sk_is_msk(queue->sock->sk) ? + mptcp_sock_set_nodelay(queue->sock->sk) : tcp_sock_set_nodelay(queue->sock->sk); =20 /* diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 05718103649b..488f6161d5ae 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -2071,6 +2071,8 @@ static int nvmet_tcp_add_port(struct nvmet_port *npor= t) 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); + sk_is_msk(port->sock->sk) ? + mptcp_sock_set_nodelay(port->sock->sk) : tcp_sock_set_nodelay(port->sock->sk); if (so_priority > 0) sock_set_priority(port->sock->sk, so_priority); diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 82660374859a..60cbf29448b0 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -244,6 +244,8 @@ static inline __be32 mptcp_reset_option(const struct sk= _buff *skb) } =20 void mptcp_active_detect_blackhole(struct sock *sk, bool expired); + +void mptcp_sock_set_nodelay(struct sock *sk); #else =20 static inline void mptcp_init(void) @@ -335,6 +337,8 @@ static inline struct request_sock *mptcp_subflow_reqsk_= alloc(const struct reques static inline __be32 mptcp_reset_option(const struct sk_buff *skb) { retu= rn htonl(0u); } =20 static inline void mptcp_active_detect_blackhole(struct sock *sk, bool exp= ired) { } + +static inline void mptcp_sock_set_nodelay(struct sock *sk) { } #endif /* CONFIG_MPTCP */ =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 25ed246db7fb..661a27a27b1a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3806,6 +3806,23 @@ static void mptcp_sock_check_graft(struct sock *sk, = struct sock *ssk) } } =20 +void mptcp_sock_set_nodelay(struct sock *sk) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct mptcp_subflow_context *subflow; + + lock_sock(sk); + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + + lock_sock(ssk); + __tcp_sock_set_nodelay(ssk, true); + release_sock(ssk); + } + release_sock(sk); +} +EXPORT_SYMBOL(mptcp_sock_set_nodelay); + bool mptcp_finish_join(struct sock *ssk) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); --=20 2.53.0 From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8F4F5326958 for ; Mon, 9 Feb 2026 09:04:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627886; cv=none; b=IFCD2zCBXnPLs8fjQPN8Qz9FwPmaesI5ERRgPuGSurFJIsi29JZ4eFIT8PYvVsypocZf0eXy32VXtFYvPQOEa/ctj8Mv4CZMhD3ctJnb714nmqEzF574ui+mAYR7rZ75W7yzl+Usih63svY2W4iRZyKP9iaM9XQg1uWec2duqBw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627886; c=relaxed/simple; bh=k2RLL4tdrek15Tot3Ev0+KIO527easR/iHR4DftlC5w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H48mEvOdgGB4/6cHpDtdL3ofKiAHPIYtRCRdQGmzf4x+/d2xktTjYBErfdzS/UQdRFe1OtxEA5Pe8B4PBDILNkOOJPnRAyQnKG+vGygflTqjXN/XQDow/qybONO2rATGGGPhOwZQsgNceVmgRu2EoxWtvYb9lLsnjhn2pVCVHY8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UcMQhBUp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UcMQhBUp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6C949C19424; Mon, 9 Feb 2026 09:04:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627886; bh=k2RLL4tdrek15Tot3Ev0+KIO527easR/iHR4DftlC5w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UcMQhBUpNg5OBkd6d88xJO/SZsto1qDWRa3eOQ1qgshLVSrdy0vBFjbcRynw6eViu zZG1pOJBn7AQIKrcxAcSLLfAIg87m7kKceF0/huXtV13YGpnI8wSZ0DmNjOEgo3m0w Tk+MlaExecNgEv+4YjwOH+/5KeYOn/ib8UEHyFaC46oeNEcWz+foe6ox1pu6LNv5Gu b9pvstL0u+/IGCsUsLo+I2Bt5oWCYtdnE/yZpLTRc+5hseF/pX+474zleOUl0NHZSQ lgxXFr2+PQ475iewR9JQmWkYU7vjeJ+x/kOWnWARNpN2KvjR0D2KBAQsENxC2OlVeP GOVacnqkH7m1g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v3 5/7] mptcp: add sock_set_reuseaddr Date: Mon, 9 Feb 2026 17:04:20 +0800 Message-ID: <59d9d179531b44c04e932f3e8eacfe7ce2d5694e.1770627071.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 introduces a dedicated MPTCP helper, sock_set_reuseaddr, which sets the address reuse flag on the first subflow socket of an MPTCP connection, and applies it to the target side in the 'NVMe over MPTCP' implementation. Co-developed-by: zhenwei pi Signed-off-by: zhenwei pi Co-developed-by: Hui Zhu Signed-off-by: Hui Zhu Co-developed-by: Gang Yan Signed-off-by: Gang Yan Signed-off-by: Geliang Tang --- drivers/nvme/target/tcp.c | 2 ++ include/net/mptcp.h | 4 ++++ net/mptcp/protocol.c | 15 +++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 488f6161d5ae..9864bb62cf5b 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -2070,6 +2070,8 @@ static int nvmet_tcp_add_port(struct nvmet_port *npor= t) 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; + sk_is_msk(port->sock->sk) ? + mptcp_sock_set_reuseaddr(port->sock->sk) : sock_set_reuseaddr(port->sock->sk); sk_is_msk(port->sock->sk) ? mptcp_sock_set_nodelay(port->sock->sk) : diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 60cbf29448b0..63b64b7699e3 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -246,6 +246,8 @@ static inline __be32 mptcp_reset_option(const struct sk= _buff *skb) void mptcp_active_detect_blackhole(struct sock *sk, bool expired); =20 void mptcp_sock_set_nodelay(struct sock *sk); + +void mptcp_sock_set_reuseaddr(struct sock *sk); #else =20 static inline void mptcp_init(void) @@ -339,6 +341,8 @@ static inline __be32 mptcp_reset_option(const struct sk= _buff *skb) { return hto static inline void mptcp_active_detect_blackhole(struct sock *sk, bool exp= ired) { } =20 static inline void mptcp_sock_set_nodelay(struct sock *sk) { } + +static inline void mptcp_sock_set_reuseaddr(struct sock *sk) { } #endif /* CONFIG_MPTCP */ =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 661a27a27b1a..5aa11062230e 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3823,6 +3823,21 @@ void mptcp_sock_set_nodelay(struct sock *sk) } EXPORT_SYMBOL(mptcp_sock_set_nodelay); =20 +void mptcp_sock_set_reuseaddr(struct sock *sk) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct sock *ssk; + + lock_sock(sk); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) + goto unlock; + ssk->sk_reuse =3D SK_CAN_REUSE; +unlock: + release_sock(sk); +} +EXPORT_SYMBOL(mptcp_sock_set_reuseaddr); + bool mptcp_finish_join(struct sock *ssk) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); --=20 2.53.0 From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 63E091E2614 for ; Mon, 9 Feb 2026 09:04:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627889; cv=none; b=Rwv58jxMAnaZd4nFI5h3LuvjrruRDgkSXjWjFZSHtBZhgwW01qX8/63XFcwlwQWVdwDASf1tZgJ/xVMZlIINZ07Bm/V7e6YKEZmKSVp0hGvKOEGyw9tDNh2FUbrb2uDdjBKIrWe8cDK31/QhV8kRMLfHXRjHKnkWqqjqpZsMh88= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627889; c=relaxed/simple; bh=msTmMdgnansMzaF2pXFWh0VsBnWmaH/aXZ7Xvpfv9uU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VoM3QbQvnE6eLJxdGZYQQJrWdjHp/DcRfzyMOJ3WSiNOBNvC2ZJqIl9FRR3G1i2dO1qmokdU8Ip031cchSEEz3o7ZA/KCo8UMiZSE3bPye0Zdcac6VBHyvrnIRjNPVM9qkg2MRM8XiTXqWAJH+hpF6vgz1Fq+9eKXBX86KTnZ7U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZcNGi58L; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZcNGi58L" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 20D87C19424; Mon, 9 Feb 2026 09:04:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627889; bh=msTmMdgnansMzaF2pXFWh0VsBnWmaH/aXZ7Xvpfv9uU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZcNGi58LSWD43KYtq++vU/0dvlckfe+UR9Rv2q6LGS0SJIHe8htE3QQISAnnsPkci bqL1NK/xBwkgCVSMcF3nPSYMjlaxag/xtCwpkye3bPgTDBhlhGrz1IT8sII3hyuSYO G5JfVO8ev1c+tslWTQr1Ik96zz2zkXIFz3GVycgPsO8oK0YBsaClRGLNKnpIDwuRZf bk3qD+4HAdHbTVn8Kl3e62NO3t9Cb2eKU9HJDnU2UnAyBdB8j+xpCCdUy16v0ar7EI UNr8lhfCUTV9rb5zN5f8H1QJi+nZF0ovjKmVGf0x58EsadLVP1At3KY8qQp2NWCCQl 0EjrwjzCFX/IA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v3 6/7] mptcp: add sock_set_syncnt Date: Mon, 9 Feb 2026 17:04:21 +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 introduces a dedicated MPTCP helper, sock_set_syncnt, which sets the SYN retransmission count on the first subflow socket and applies it to the host side in the 'NVMe over MPTCP' implementation. Co-developed-by: zhenwei pi Signed-off-by: zhenwei pi Co-developed-by: Hui Zhu Signed-off-by: Hui Zhu Co-developed-by: Gang Yan Signed-off-by: Gang Yan Signed-off-by: Geliang Tang --- drivers/nvme/host/tcp.c | 2 ++ include/net/mptcp.h | 7 +++++++ net/mptcp/protocol.c | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 6188e01b85db..ac1b21e3578d 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1807,6 +1807,8 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nct= rl, int qid, nvme_tcp_reclassify_socket(queue->sock); =20 /* Single syn retry */ + sk_is_msk(queue->sock->sk) ? + mptcp_sock_set_syncnt(queue->sock->sk, 1) : tcp_sock_set_syncnt(queue->sock->sk, 1); =20 /* Set TCP no delay */ diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 63b64b7699e3..d6bb67a55f24 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -248,6 +248,8 @@ void mptcp_active_detect_blackhole(struct sock *sk, boo= l expired); void mptcp_sock_set_nodelay(struct sock *sk); =20 void mptcp_sock_set_reuseaddr(struct sock *sk); + +int mptcp_sock_set_syncnt(struct sock *sk, int val); #else =20 static inline void mptcp_init(void) @@ -343,6 +345,11 @@ static inline void mptcp_active_detect_blackhole(struc= t sock *sk, bool expired) static inline void mptcp_sock_set_nodelay(struct sock *sk) { } =20 static inline void mptcp_sock_set_reuseaddr(struct sock *sk) { } + +static inline int mptcp_sock_set_syncnt(struct sock *sk, int val) +{ + return 0; +} #endif /* CONFIG_MPTCP */ =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 5aa11062230e..bb9ccfa840f2 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3838,6 +3838,25 @@ void mptcp_sock_set_reuseaddr(struct sock *sk) } EXPORT_SYMBOL(mptcp_sock_set_reuseaddr); =20 +int mptcp_sock_set_syncnt(struct sock *sk, int val) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct sock *ssk; + + if (val < 1 || val > MAX_TCP_SYNCNT) + return -EINVAL; + + lock_sock(sk); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) + goto unlock; + WRITE_ONCE(inet_csk(ssk)->icsk_syn_retries, val); +unlock: + release_sock(sk); + return 0; +} +EXPORT_SYMBOL(mptcp_sock_set_syncnt); + bool mptcp_finish_join(struct sock *ssk) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); --=20 2.53.0 From nobody Thu Apr 30 08:22:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 C68A21E2614 for ; Mon, 9 Feb 2026 09:04:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627891; cv=none; b=klxTqmS/F9I/Pu63/+JCPn/at1EqT0Co1l6h4LRSbnbbPgApBXvoPcyW1Mfw9WubFFRJg04VN2SMc/07SK+5xCkctSCHhqm6tOZWG6OdBmYPUQYQ2jnb72Ii0J6LP9WXDJezEfOcT0C10xPfBDIGPST92IB0ggCC9OWQqUSzi7o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770627891; c=relaxed/simple; bh=fQ6EIrWkx/fQrUxe1K423djUdSzMM9ycX8P8o+hPhcc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OYJLxPHN7ldhqWRI6sbJAkK8CawUBwDmC9hu96mL2MmAZ1zMBOin0kRMoHsEFm54PSboK52f4m4th4eWGB4wZbHmYZGF1kKi2N4GwamnNEOb8HgxndX9T8yDkhcclMkmISsQJA8rNLwQCgZSgh3vfdjaX+1vploie7n3ZQBLS58= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JKE7ZjrY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JKE7ZjrY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8755FC116C6; Mon, 9 Feb 2026 09:04:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770627891; bh=fQ6EIrWkx/fQrUxe1K423djUdSzMM9ycX8P8o+hPhcc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JKE7ZjrYvoZlSml9C1cuHNqZq+p/efbLBQzATYkVNz/4dhrhe99C2qd3UDRd44yIb E9v/mHp7w6/EpdUpfHZOkzJY2GPOUAPmBiIFGLXlkNfv8FIRcqmSdKhwxhay/7KbCu iOedRG/zWgI7RU9JEz/3Tbq0h2UxuXEIn536yU5L3jcs2U8YTtosTDl7vm+gVd9b9K y0SzSE4WT5b/qvXbIhFk+10gFvU2ZOckaaoORN7P+0Do66ROFbuZJbGY077Vg0XXis X8oXHuZtJ7nOhUqdA7BKzhz0FfEuGI2QtJNxZA6zCEmjVjTPBdZ3FvC39vcsrFFxfm yIuSbkAz8RtNQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v3 7/7] selftests: mptcp: add NVMe-over-MPTCP test Date: Mon, 9 Feb 2026 17:04:22 +0800 Message-ID: <57c6dbf2e50b06c5ec21cb4db0eac51a5b31756b.1770627071.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 A test case for NVMe over MPTCP has been implemented. It verifies the proper functionality of nvme list, discover, connect, and disconnect commands. Additionally, read/write performance has been evaluated using fio. This test simulats four NICs on both target and host sides, it shows that 'NVMe over MPTCP' delivered bandwidth up to four times that of standard TCP. Co-developed-by: zhenwei pi Signed-off-by: zhenwei pi Co-developed-by: Hui Zhu Signed-off-by: Hui Zhu Co-developed-by: Gang Yan Signed-off-by: Gang Yan Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/config | 7 + .../testing/selftests/net/mptcp/mptcp_nvme.sh | 179 ++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100755 tools/testing/selftests/net/mptcp/mptcp_nvme.sh diff --git a/tools/testing/selftests/net/mptcp/config b/tools/testing/selft= ests/net/mptcp/config index 59051ee2a986..0eee348eff8b 100644 --- a/tools/testing/selftests/net/mptcp/config +++ b/tools/testing/selftests/net/mptcp/config @@ -34,3 +34,10 @@ CONFIG_NFT_SOCKET=3Dm CONFIG_NFT_TPROXY=3Dm CONFIG_SYN_COOKIES=3Dy CONFIG_VETH=3Dy +CONFIG_CONFIGFS_FS=3Dy +CONFIG_NVME_CORE=3Dy +CONFIG_NVME_FABRICS=3Dy +CONFIG_NVME_TCP=3Dy +CONFIG_NVME_TARGET=3Dy +CONFIG_NVME_TARGET_TCP=3Dy +CONFIG_NVME_MULTIPATH=3Dy diff --git a/tools/testing/selftests/net/mptcp/mptcp_nvme.sh b/tools/testin= g/selftests/net/mptcp/mptcp_nvme.sh new file mode 100755 index 000000000000..14a620040df2 --- /dev/null +++ b/tools/testing/selftests/net/mptcp/mptcp_nvme.sh @@ -0,0 +1,179 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +. "$(dirname "$0")/mptcp_lib.sh" + +trtype=3D"${1:-mptcp}" +nqn=3Dnqn.2014-08.org.nvmexpress.${trtype}dev +ns=3D1 +port=3D1234 +trsvcid=3D4420 +ns1=3D"" +ns2=3D"" + +ns1_cleanup() +{ + mount -t configfs none /sys/kernel/config + + rm -rf /sys/kernel/config/nvmet/ports/${port}/subsystems/${trtype}subsys + rmdir /sys/kernel/config/nvmet/ports/${port} + echo 0 > /sys/kernel/config/nvmet/subsystems/${nqn}/namespaces/${ns}/enab= le + echo -n 0 > /sys/kernel/config/nvmet/subsystems/${nqn}/namespaces/${ns}/d= evice_path + rmdir /sys/kernel/config/nvmet/subsystems/${nqn}/namespaces/${ns} + rmdir /sys/kernel/config/nvmet/subsystems/${nqn} +} + +ns2_cleanup() +{ + nvme disconnect -n ${nqn} || true +} + +cleanup() +{ + sleep 1 + + ip netns exec "$ns2" bash <<- EOF + $(declare -f ns2_cleanup) + ns2_cleanup + EOF + + ip netns exec "$ns1" bash <<- EOF + $(declare -f ns1_cleanup) + ns1_cleanup + EOF + + losetup -d /dev/loop100 + rm -rf /tmp/test.raw + + mptcp_lib_ns_exit "$ns1" "$ns2" + + kill "$monitor_pid_ns1" 2>/dev/null + wait "$monitor_pid_ns1" 2>/dev/null + + kill "$monitor_pid_ns2" 2>/dev/null + wait "$monitor_pid_ns2" 2>/dev/null + + unset -v trtype nqn ns port trsvcid +} + +init() +{ + mptcp_lib_ns_init ns1 ns2 + + # ns1 ns2 + # 10.1.1.1 10.1.1.2 + # 10.1.2.1 10.1.2.2 + # 10.1.3.1 10.1.3.2 + # 10.1.4.1 10.1.4.2 + for i in {1..4}; do + ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$n= s2" + ip -net "$ns1" addr add 10.1.$i.1/24 dev ns1eth$i + ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad + ip -net "$ns1" link set ns1eth$i up + ip -net "$ns2" addr add 10.1.$i.2/24 dev ns2eth$i + ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad + ip -net "$ns2" link set ns2eth$i up + ip -net "$ns2" route add default via 10.1.$i.1 dev ns2eth$i metric 10$i + ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric= 10$i + + # Add tc qdisc to both namespaces for bandwidth limiting + tc -n $ns1 qdisc add dev ns1eth$i root netem rate 1000mbit + tc -n $ns2 qdisc add dev ns2eth$i root netem rate 1000mbit + done + + mptcp_lib_pm_nl_set_limits "${ns1}" 8 8 + + mptcp_lib_pm_nl_add_endpoint "$ns1" 10.1.2.1 flags signal + mptcp_lib_pm_nl_add_endpoint "$ns1" 10.1.3.1 flags signal + mptcp_lib_pm_nl_add_endpoint "$ns1" 10.1.4.1 flags signal + + mptcp_lib_pm_nl_set_limits "${ns2}" 8 8 + + mptcp_lib_pm_nl_add_endpoint "$ns2" 10.1.2.2 flags subflow + mptcp_lib_pm_nl_add_endpoint "$ns2" 10.1.3.2 flags subflow + mptcp_lib_pm_nl_add_endpoint "$ns2" 10.1.4.2 flags subflow + + ip -n "${ns1}" mptcp monitor & + monitor_pid_ns1=3D$! + ip -n "${ns2}" mptcp monitor & + monitor_pid_ns2=3D$! +} + +run_target() +{ + mount -t configfs none /sys/kernel/config + + cd /sys/kernel/config/nvmet/subsystems + mkdir -p "${nqn}" + cd "${nqn}" + echo 1 > attr_allow_any_host + mkdir -p namespaces/${ns} + echo /dev/loop100 > namespaces/${ns}/device_path + echo 1 > namespaces/${ns}/enable + + cd /sys/kernel/config/nvmet/ports + mkdir -p "${port}" + cd "${port}" + echo "${trtype}" > addr_trtype + echo ipv4 > addr_adrfam + echo 0.0.0.0 > addr_traddr + echo "${trsvcid}" > addr_trsvcid + + cd subsystems + ln -sf ../../../subsystems/${nqn} ${trtype}subsys +} + +run_host() +{ + local traddr=3D10.1.1.1 + + echo "nvme discover -a ${traddr}" + nvme discover -t "${trtype}" -a "${traddr}" -s "${trsvcid}" + + echo "nvme connect" + devname=3D$(nvme connect -t "${trtype}" -a "${traddr}" -s "${trsvcid}" -n= "${nqn}" | + awk '{print $NF}') + echo "devname=3D${devname}" + + sleep 1 + + echo "nvme list" + nvme list + + echo "fio randread /dev/${devname}n1" + fio --name=3Dglobal --direct=3D1 --norandommap --randrepeat=3D0 --ioengin= e=3Dlibaio \ + --thread=3D1 --blocksize=3D4k --runtime=3D10 --time_based --rw=3Drand= read --numjobs=3D4 \ + --iodepth=3D256 --group_reporting --size=3D100% --name=3Dlibaio_4_256= _4k_randread \ + --size=3D4m --filename=3D/dev/${devname}n1 + + sleep 1 + + echo "fio randwrite /dev/${devname}n1" + fio --name=3Dglobal --direct=3D1 --norandommap --randrepeat=3D0 --ioengin= e=3Dlibaio \ + --thread=3D1 --blocksize=3D4k --runtime=3D10 --time_based --rw=3Drand= write --numjobs=3D4 \ + --iodepth=3D256 --group_reporting --size=3D100% --name=3Dlibaio_4_256= _4k_randwrite \ + --size=3D4m --filename=3D/dev/${devname}n1 +} + +init +trap cleanup EXIT + +dd if=3D/dev/zero of=3D/tmp/test.raw bs=3D1M count=3D0 seek=3D512 +losetup /dev/loop100 /tmp/test.raw + +run_test() +{ + export trtype nqn ns port trsvcid + + ip netns exec "$ns1" bash <<- EOF + $(declare -f run_target) + run_target + EOF + + ip netns exec "$ns2" bash <<- EOF + $(declare -f run_host) + run_host + EOF +} + +run_test "$@" --=20 2.53.0