From nobody Sun Mar 22 08:17:28 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 C7B35336881 for ; Thu, 5 Mar 2026 04:05:44 +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=1772683544; cv=none; b=H1yxZchxsI/54y74opGEWpaqE0nqy8X0DEl5jTnVEaANYZKw1GMO7C8YmYA8QW6QOiTORuP9O/xyEFTgM2XnR5uoNWSTwPIlmaVlUKv+Kfmzw49U94tTFIvNtdAKX+KvN8xkaPrKXHbAfnxdeGJ9QPwg5TNXi+e4hOJZSUbvReY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683544; c=relaxed/simple; bh=5wAqg4Y76q9Vqv/QfZpGMwdsak39VQtYVPozE4uN6y0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JTSxFxoVdWyuvCmVVlMTtFh5C0vhO4v16LNncLYpHdOOw5ssP/egPw8ZIm85axIzaPx5ZBPvwlnIk3aNCiivje5N/zsuuqoh6wNZGhEVqnqvaetUgZazLxilD06/WGUEEIIGQNerc08zzlXOlCvUfmIixAx+tmxE+GqRafoMdpQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tJacmfZt; 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="tJacmfZt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35EB1C116C6; Thu, 5 Mar 2026 04:05:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683544; bh=5wAqg4Y76q9Vqv/QfZpGMwdsak39VQtYVPozE4uN6y0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tJacmfZt/GYz/2EB30OtN1jdzqS9vPwp6WNWFUjvZjC98YTA+9MrAa/l7sFZMyLnJ rQ9o8KQ30ioYppipATP27CSGa6qRg+tINPWWRct9UG1gKLUSnMFdCiud9fdBj8jPGo tFg4q1diBYbWE4TcE6riedxfqHCTkVpvxpTgcGbvpLEC1aLniYMsPoowNaWSIOpYff QkMdf3C/hr1smvL5eKb164OalbSidCx5/VgcuhjhGeS6bF1DahIUbeFZFjZZNhpIiA E3QuOCT1K5bcQy8WbCfFWfyI2DFuB9r47f3y9X4FmmvvM+9azHWqOSJSPszydQKBhG KjHRvIqb2Y6Dg== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang Subject: [RFC mptcp-next v4 1/8] mptcp: add sk_is_msk helper Date: Thu, 5 Mar 2026 12:05:19 +0800 Message-ID: <20f722bb03b7e2b3959ac4cd377515a423c0b164.1772683110.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 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 Sun Mar 22 08:17:28 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 65799336881 for ; Thu, 5 Mar 2026 04:05:48 +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=1772683548; cv=none; b=OtZvEv92p2W8JROFBKrNuI58jpZyFklm4h+a3emCfWaDCv4FNG0ayecWEYmVc1smCOUsGYVm9RHxqdGcg+PXYHtZbLQ38XYzAs8eC5TDZVJ/UAziSYE9AUKKWqZSWqt2sFuFshsALbIWpqUR04cS4tCSEq98KKgUhbiyoMQLKCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683548; c=relaxed/simple; bh=tcONdptBQn2Ep/oyzZEhEW5gqHIf/pgAo4zgOelzXX8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RiVcUSWphc7LDPYRpxojwVfNVQJ6WNiSICKx/urL/gYXm/tJXe1Rgh2MSgsyEm7//QjB/yjXMwb74RqFhw6g4LEJgNn+vKLThkV9mQB5MRArY6L0/sywkZBwh2R2SZvxnd9CszZULGRp9MClq4nppypQjNrPloRnUUHi1vgHQr0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jUYun7th; 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="jUYun7th" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1B5BAC19422; Thu, 5 Mar 2026 04:05:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683548; bh=tcONdptBQn2Ep/oyzZEhEW5gqHIf/pgAo4zgOelzXX8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jUYun7thyUvwrEy3wIy3APPJQsGISctTTHqvAwZQfejxcMNGpY4fvG0pD8fbpuEBv q8FzHjVwcVEZElquR3z2mvyLkRp8ezaWgqokbfGy8DArdM5pLsjvMoAdI+cDu0PBOs ctLJcsq215iTEKl6t53uc8AxdGSxUIUa5MCvWOKm9rTA/7QwnnKFko/gb5td4ww6Q4 xD7TjVCtKrrnAAlEhXLeTDLYpQu4Gtne3aSdV5m0rYno26oq8Eu7ajBMmtTkmF6cVH 7fhwDHLz3z0qf+QYAC4BpRKCl22QQxJpI15IsikfZqt1TvpmZb6yqihKCbfNGzmKP7 2TNZVS9L4uIWA== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v4 2/8] nvmet-tcp: add mptcp support Date: Thu, 5 Mar 2026 12:05:20 +0800 Message-ID: <06a0c9133bf17e4d7544c92c0d4ffb469c97734f.1772683110.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 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 3088e044dbcb..4b7498ffb102 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -38,6 +38,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 acc71a26733f..5a58b544f258 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 @@ -1067,7 +1068,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, @@ -2034,6 +2037,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_obj(*port); @@ -2054,6 +2058,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) { @@ -2068,7 +2077,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; @@ -2220,6 +2229,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; @@ -2233,6 +2255,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); @@ -2243,6 +2271,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); @@ -2262,3 +2291,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 Sun Mar 22 08:17:28 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 2D7B829CE9 for ; Thu, 5 Mar 2026 04:05: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=1772683552; cv=none; b=VMRUvz+sF9vRYfJmo/Nf2GM8tb7Udct0FYi2I2CcUDSsCjZcZrMAoByh9DY9x6wlCnT0YH2GpCWYexxLgCe/33yVAxH0fXyZVTypr4hRW78PJQc8FC6A2RA/MZVLMjZgVPBPo+xTn58wq3d9zfktlfwDInkOqv27RbKc5VkD5jE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683552; c=relaxed/simple; bh=8rOxL4vSeVBdS6+Z/LwLGxEQ3cFSgcTZVUdWvXjPsNw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jjx0TQnp1OzmdegIg7ZslpT1Mf5rmIOIKVFaSQufs5POuJwPRurQfvF610rA8RiRxHfLyX0QTm+KkYrlj3jxWPbAFdq5jMuOMR7qbd3eKCHFIaGVf9riOxQOocCs7qQorEwFRyIFV5xwyIX6HOBxG6VcM4yZENbq0glj34XNGfQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KyEnMdqq; 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="KyEnMdqq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BD3E4C116C6; Thu, 5 Mar 2026 04:05:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683551; bh=8rOxL4vSeVBdS6+Z/LwLGxEQ3cFSgcTZVUdWvXjPsNw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KyEnMdqq74EyVzUAHWPWH76NbK7aHJQZDd0RBQtYYbJduwpvdrGBTCQ8k1da/QuA6 GWBaZkAg+fQtIoRHwK6UIhB4IE3tyVSJNyhnyk6owVgMv3XpjW7aLjorDACWRLRByO Q++2dWYjUn28H1QdwRyQTucpHl4Q/X8T9OKRPuESy9urp08K9OlXmpIjCqiz1YGoYH ZHSRhqXVVuJ6pQGT34VdfpKhdSk96Vtz9X7r81pQ1pjSdOiBPNk8acIU7WpPBHuRrk /3NhFXl75VfT3HvEheFy7Dv/V07yG0/retgNWY8YcY1u5Kc3mh3sCGfzkwpJwtkbaO +X1PvfMYtHlKA== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v4 3/8] nvme-tcp: add mptcp support Date: Thu, 5 Mar 2026 12:05:21 +0800 Message-ID: <21f43910f36f2911da95bd9fe768f7097a5f82a2.1772683110.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 9ab3f61196a3..8446630cceca 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); @@ -3022,6 +3028,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; @@ -3047,6 +3065,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 @@ -3054,6 +3073,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 Sun Mar 22 08:17:28 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 C7D6C336881 for ; Thu, 5 Mar 2026 04:05:55 +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=1772683555; cv=none; b=mt+Kx1p/HkoziDzQoVT+G//12TFFR0pUCXu6D5GJ0Trj+MzTHxisNGs2YgEozeQwWhDnrWxNRKTIQuoLj3DTergA/u/P8/fqPRP8uDPD3efD3lE6dCQkvVYugOSFXVPX46QTourfi8ENQXQhpLpAMTquxEjInjiBRy/NZnEvYas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683555; c=relaxed/simple; bh=JiC4drRexB923fNGx/D1LWDjs3IVzUljzNF1ghhTK5Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NzgxKF48NH2mwgsdc0KsmUmFb5pmggGuUQM08YP9OM83XM4F1xzD5O1xlNqKqNgf4yP+56gQ387l/LwJf6jpUuo1DEpZ4iI6wamtm0EEI1GiC09GG3Pvj80Z8add6GbycowgxB0Rg6qDTI7ppngFiCbHIXy1K8vdp6dJEp5XLso= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V1bmXMG2; 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="V1bmXMG2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 77ABFC116C6; Thu, 5 Mar 2026 04:05:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683555; bh=JiC4drRexB923fNGx/D1LWDjs3IVzUljzNF1ghhTK5Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V1bmXMG2ARx+jzy3EnNQAFoWeCggcFZBzlhH5S9NXJix8Lrj3tlXkN2NzCAWdVeiX wO10jDEIhJgtWkINQncWdrqItm7//OYYIS6WOjyiEwnR/wu38DvpFqCyXaEg2y1B0m fFkLuVwwcf7ImJ0S/LevXQaZa65jJt1Rg0hMMm9pbD8YnXVgK3vXjWH2o14JiorIMj 1WG+6PIJj2JLlGdiFzhDMM3wUm96AjzpuNNvDJ2fc1czEKlZZN8o+0O4cCG1k08JMs pwYnymqetdUXGu7vqs6lE44k6y9AG81wJUoDhG41hCFWEP/aVhzPh/WhoCPgefAz8j PHpTqNIX3sWtg== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v4 4/8] mptcp: add sock_set_nodelay Date: Thu, 5 Mar 2026 12:05:22 +0800 Message-ID: <5f99af6432d129772550d3545d4d67f472262587.1772683110.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 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 8446630cceca..dc5b3ecdd885 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 5a58b544f258..8452d38614a6 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -2087,6 +2087,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 c8fcc46ed042..451bc4df4fa4 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 Sun Mar 22 08:17:28 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 394C7336881 for ; Thu, 5 Mar 2026 04:05:58 +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=1772683559; cv=none; b=W66wLg0U/5GpIppd8k1BECs0Lwsh9O3MRnFsJrdv0JdEM/7FHx4Hj1JX2wgl3iBIcudnwECaicR9zfpjx9pjOUP4C4GCeTQqddmW8XW/jWuUnXNJhX5tZp9d43VNNmIoYl1o4iJlrPjtK+Ez8l0jyExo0IE/8/Syx+y/uZAgV/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683559; c=relaxed/simple; bh=+GVZwWw13FtMFjCyXVQu3iPZbPcUzwlM1qsKP0XU/Yg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CXqQj6Pv9Tc/qMxaqd6UOeexai8kMJVpkp6j7tPfe+4RZUiAu0dN4SAttlV662I7R/3YXcm+A6LJ57+tWIusDLsp1qCp5/XXDBoK3s9uZ0+rMsDRl29ryAN69qwWrn/+hkKpUGT4+QPCht2F0xQPz9AfNtC7rPpWUybC+LwVWpA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TcTgqWym; 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="TcTgqWym" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5649CC116C6; Thu, 5 Mar 2026 04:05:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683558; bh=+GVZwWw13FtMFjCyXVQu3iPZbPcUzwlM1qsKP0XU/Yg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TcTgqWymXSZtqozEMSvk5hmp3Pc6nhUwzsanRB+HYaSA1KQ3aKCxaZQP+1O1Ar6UZ ILzuLyXh7HekBgxhcKq+ss88q2ZGcKzpoZj65zjfDFYLtJPiB5jahdmL/hmH+gvOBH DLrbF2+IlOsHQuUQzmFchpkHGlbvlcl+Ud96W7wX2mtnTEMUL5zDSnsRSJ5auwhMMZ S7B4lsTVRvIwM8Wwd6kHLbNh4GNXpJJzwhTYM4Mi+XNg3k849d0U5SCVg6iE4p/vLR Zq7UQVRXkZFi0KwX4rvz0w184OFATKATpuoMwHVYJnIKw093xmos74OejdO0R1Ngvg ZMeUxakKlmWrw== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v4 5/8] mptcp: add sock_set_reuseaddr Date: Thu, 5 Mar 2026 12:05:23 +0800 Message-ID: <8dca88dcac861ed704dd4dba9528bc7f9b6b4892.1772683110.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 8452d38614a6..5111c0e690ee 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -2086,6 +2086,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 451bc4df4fa4..61f4eba02b37 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 Sun Mar 22 08:17:28 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 574C2336881 for ; Thu, 5 Mar 2026 04:06:02 +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=1772683562; cv=none; b=Ji3QkXXqJ0u1GO3EtjPH1ZhXbXmROld9hVzigDk/GJBRbSO4WBG4hmHDWwaRnaenAosmligpImbpBo9T/Kch5nY9iLig3nt/QAtrMH7uvU2I9ZJMcCfyEfC1sNivL//RpzAkP32E2cXohCgsbD+Kt7swbGF9wGdwLCZ4XWcdxPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683562; c=relaxed/simple; bh=uzsJa1Bqh20LQFOb4ZEawv08Hyzu04LYsaqJeWOJVmE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SoEd96HwkURwVifwYGS4i+uccZiooNfRdXOw0UN9p1LRnmZXQSo4vJzggm8ISMYDO98iHsIhPWR103ACm2hAHvw5f6wmpZeCc/cOiwsfcgzF4gpcRF4a3FYMCGOuSO3teGt19kqMDW1Rn8/J4OdJISbraS1X/mQrDFz3phfeffs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Zh2oi6YP; 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="Zh2oi6YP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 81D04C116C6; Thu, 5 Mar 2026 04:05:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683562; bh=uzsJa1Bqh20LQFOb4ZEawv08Hyzu04LYsaqJeWOJVmE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zh2oi6YPHbhU4kZJQ/zpvS8OdV+Z1ppLi1h+tgVLfJpME+zt64Gp2kjftNU1WJmON gSqPZVij1800NSMA8qf0mX0jCR+qLUc7CzAv817z4k7yDCw5WyjuAmvlYUpFQYrfg7 jggvw9agOSlGQm4wD2XNd4TxVaMtgIrqHvZ/65lUgApEP31Qczsmxvg7NaZibeYuA8 vm/CKo5qq+1vKhVpHkjyEJhR2TdAKA00XG9XoWsLkvTmSUNTvBOvAsLZxexAXdfm0/ W0j7XIbJ97TEYBWq2gecm/b8ikXEstz7ooXWHRDAowc14ZFYT5OkC3cTvShw//4QWz wE/HwkpBC9SFQ== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v4 6/8] mptcp: add sock_set_syncnt Date: Thu, 5 Mar 2026 12:05:24 +0800 Message-ID: <76939d6c3a650ef72430649a480e700ba0049f24.1772683110.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_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 dc5b3ecdd885..8ead932e7999 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 61f4eba02b37..bc507b6e91e7 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 Sun Mar 22 08:17:28 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 2066129CE9 for ; Thu, 5 Mar 2026 04:06:05 +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=1772683566; cv=none; b=LoKjfogGWlXV2M3UZB3ssKIow6VH3j30Ch6RZX3Syzr1grE5PSva3vYoM9eVdGz9b5MIrZCWGifQ4x02tABz1V5A5kSFkoqQumq3i/DJ2r9LCl8191RxsrOPZfSA99IZauXZEsoMedq34XXU6zVoRR+8exVWQDq2A8UDU2i4i9Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683566; c=relaxed/simple; bh=d1jiO4S0GC7KEQ30aZA3J5+ZZ+gLzmduXLWB1jEPCI0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bsKcUttmaPOu0rnj/Om8CxQMQHtwWNdFQVqttf1Rl6nekT0haFgHMmTGH67iIWsAGSPVotbNFTjz4qzSntNw0BDQz9a90E5l3SKzSqhdz9ormd3ot/f88Gitv3X8bW3SipezX24NamcAjyCirpZLyo6AnOB8hKGzGJsvD7PvD90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=okKiKBfR; 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="okKiKBfR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E2379C2BC87; Thu, 5 Mar 2026 04:06:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683565; bh=d1jiO4S0GC7KEQ30aZA3J5+ZZ+gLzmduXLWB1jEPCI0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=okKiKBfRzoaXKKte4giwoMTBfqqD8cjQ9Bb60HPA5cYHZgck2EdwGGpW8+lPstOiY FSG81yz4ctMorWaBzgZ8AWBZIoTrB5fmufqIOCgtM83NgXU7j7QI/hRzMVmKAj0oP2 ZWPEkq5uzvAySzVzICRc17tnl/SI/9Q7O+QvRBl/xAgfoa0Eghzq4XIWPlPNB3tlw0 gXzLO7C65+mA0xUdNrpSYHKU/8EgtqqheAAZx7Jog8m3/Fj6S2EiDVcg8hn7ZaRTD9 pr5iw+EAkYd2DrRpOWuxWCg0xDqfo4sTkkxC3EKsJLL6nmeypgrXe2NE8qhcE0N9Nk pMz4rvXVCLoFg== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang , zhenwei pi , Hui Zhu , Gang Yan Subject: [RFC mptcp-next v4 7/8] selftests: mptcp: add NVMe-over-MPTCP test Date: Thu, 5 Mar 2026 12:05:25 +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 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, each limited to 100MB/s. It shows that 'NVMe over MPTCP' delivered bandwidth up to four times that of standard TCP: # ./mptcp_nvme.sh tcp READ: bw=3D112MiB/s (118MB/s), 112MiB/s-112MiB/s (118MB/s-118MB/s), io=3D1123MiB (1177MB), run=3D10018-10018msec WRITE: bw=3D112MiB/s (117MB/s), 112MiB/s-112MiB/s (117MB/s-117MB/s), io=3D1118MiB (1173MB), run=3D10018-10018msec # ./mptcp_nvme.sh mptcp READ: bw=3D427MiB/s (448MB/s), 427MiB/s-427MiB/s (448MB/s-448MB/s), io=3D4286MiB (4494MB), run=3D10039-10039msec WRITE: bw=3D387MiB/s (406MB/s), 387MiB/s-387MiB/s (406MB/s-406MB/s), io=3D3885MiB (4073MB), run=3D10043-10043msec 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 From nobody Sun Mar 22 08:17:28 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 D9E79336881 for ; Thu, 5 Mar 2026 04:06:08 +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=1772683568; cv=none; b=jE+dEZol9me0H+KKyZMloLJl6m7eyFkfAilQO8Y3XJeMmacqgp40K4FZ6s/4Nb0BV9peJ8bRJM9HsI/rZXC7Z2SpR0uo0VwPZSfIPXjISdGfd1mlA3L8EiM2Ev6cggBevwhG9m0X5q+Hnu2Jp/KhlayEBI7JwSqhNyuAa6WwSZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772683568; c=relaxed/simple; bh=lNyyLL0dxvONAvY9syYgVMAz2DVnefJqocT4+oA+a6k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=InQ81cYV6IS+z8yMnEtM2XiPwLmqD1T1ogD8AWm1s2aLvUJcZLXosVn84lY+yyBxutWmNWgW8DGUArJZFDXSfo49qF3ycfT6txa6dJIjclUC7TWMUV8DzaK2d+Jp2PVokNsj3vxCu4FEIt+gprbGCw7e44BjmiApXYz7wrVySDU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Zg1uBls5; 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="Zg1uBls5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5E5E3C2BC9E; Thu, 5 Mar 2026 04:06:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772683568; bh=lNyyLL0dxvONAvY9syYgVMAz2DVnefJqocT4+oA+a6k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zg1uBls5Elnt7zZAYKuD8sAsxpjBreNPG2JmsCHrYRCWXi3Wh+a/CztdxTcpGHn/6 krhtBeIK3xbi6i8kUYceANPL24JqMVslD4f1Z03NuT/fOY8HDp/VoL07PrU9SBil84 69pkPtiCC/KF+qRH79xU+S+p3f4i9vDcDULYf5KYnkRGWIphChpAjWEnRdP7fFkgpa vfY1kdTEI66xAUbahC1tZXvixv8dsNATKYji0yfk2QF9q6s8/BxSXIbta6poEA9/e4 Lx99LIS8/JnTTpeTxPNoxEQYZU4mCWn2nykx2pOveacaTTOvhJQwLtl+MRUOmANcgn Km4dIXa55T33g== From: Geliang Tang To: mptcp@lists.linux.dev, nilay@linux.ibm.com, ming.lei@redhat.com, hare@suse.de Cc: Geliang Tang Subject: [RFC mptcp-next v4 8/8] selftests: mptcp: nvme: set iopolicy Date: Thu, 5 Mar 2026 12:05:26 +0800 Message-ID: <31241344d80a577e7e46b584f7ce6e7011cc5d5d.1772683110.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 Added NVMe iopolicy testing to mptcp_nvme.sh, with the default set to "numa". It can be set to "round-robin" or "queue-depth". # ./mptcp_nvme.sh mptcp round-robin Cc: Nilay Shroff Cc: Ming Lei Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_nvme.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_nvme.sh b/tools/testin= g/selftests/net/mptcp/mptcp_nvme.sh index 14a620040df2..2e03f47d22da 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_nvme.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_nvme.sh @@ -4,6 +4,7 @@ . "$(dirname "$0")/mptcp_lib.sh" =20 trtype=3D"${1:-mptcp}" +iopolicy=3D${2:-"numa"} # round-robin, queue-depth nqn=3Dnqn.2014-08.org.nvmexpress.${trtype}dev ns=3D1 port=3D1234 @@ -140,6 +141,12 @@ run_host() echo "nvme list" nvme list =20 + subname=3D$(nvme list-subsys /dev/${devname}n1 | + grep -o 'nvme-subsys[0-9]*' | head -1) + + echo ${iopolicy} > /sys/class/nvme-subsystem/${subname}/iopolicy + cat /sys/class/nvme-subsystem/${subname}/iopolicy + 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 \ @@ -164,6 +171,7 @@ losetup /dev/loop100 /tmp/test.raw run_test() { export trtype nqn ns port trsvcid + export iopolicy =20 ip netns exec "$ns1" bash <<- EOF $(declare -f run_target) --=20 2.53.0