From nobody Mon Nov 10 15:51:21 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4d4vKP68yMz6GtJK; Mon, 10 Nov 2025 15:51:21 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4d4vKP5Qr0z43hd; Mon, 10 Nov 2025 15:51:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1762789881; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bwJFhuOF7RlvAMA5ojO2ThaZ1oQJhaeF8ZGwz6JVyoc=; b=WdJsjhA5SiYW3eerIDx8UwNb/BaXanfS8fCAAmZp8MdqQ7WhrS5ViEgsUu6ap/lsp78DcW Q73WKzN3ChEma+n2aUIXLH+UTXi9qy0fGLUW8zoQ53wP89sHbaPVaKhKD5duQ0Jx3VMaJW 43jKjEN7YcaHxKMQ/c7vCXfFWflaSw+VsBzcrLj0zuPhSIC+ymP6jIUkK452QHY4Vhlt9o CNw6f4m2VdRq1F1smNzTfivqzypKr+CEHIFR1Fj47Oqksg/07Kp4bi1ydSGZr0zzusxl8V yf6qw9o6232GloUfPX2AMiqP8jGAWRo08eiFcVN04QvevoYkvwJmTVIXjWUzLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1762789881; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bwJFhuOF7RlvAMA5ojO2ThaZ1oQJhaeF8ZGwz6JVyoc=; b=IE1tn2mIxyk6rkI5zAzH/ki8PQznd5K6HIi9clAbR9ucTLQzkvArjeog5GkCb0FXwBGCHw hl0G5Cg6Ma5Ghb45juvHaNkLM9xAS12otJTd+gdVUaA9pIxj2sG3rllnM9+3fedlTx+j+s wA1BaJWC98ON5kfM/W6+tuI0pFF+AT5w6uAOO1GwmquX3tz9QQ/N9RGimLSnTpDhi/EVF8 OLXdaRFZbU3wjC/0aNHuDUpSzIDGnd0YqY99pmwqH3I1PnG2DdAivuomRJQfLjXWBG/RuQ N9FeT87n2P9PbcVX503ipzMELrrEY4oYgnBQjI5oOIcLRlnNAogIGvfFPXkHag== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1762789881; a=rsa-sha256; cv=none; b=Cx1kz3qaRKyWH/qJ4PaU6K3V28wfgSWSowzxFmkyOozxtArwae5joSIv9N6WutNg/BzUsl 0xqnNClo00ZoXRnO1uaZ39laBJA/sFuFVVSE2i2FEK2vwWgjoR9K7eRB98pN4iUYQj5MpL tiZCfbUvJpVC1cpPpCXrsjyBGO6wJ6Nx6mb0QSGYyTrYWeJi7cPmTPjQg7jIo1HLmC1hSS OncbDPCTZq4Zx+E9FMWtJMdSLPkecvyxqwjvTQ6TnyXiQNNtggDOiD3nBwaHDqXnM7r/OH oJnqC/N987kMc4jKcCJTJiAoiPZCBIykZwtsK09Up1jJLHdMmkJXYy9ED1g1hw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4d4vKP52PZz7qp; Mon, 10 Nov 2025 15:51:21 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5AAFpLre047977; Mon, 10 Nov 2025 15:51:21 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5AAFpLoL047974; Mon, 10 Nov 2025 15:51:21 GMT (envelope-from git) Date: Mon, 10 Nov 2025 15:51:21 GMT Message-Id: <202511101551.5AAFpLoL047974@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 01dd6a83b5ff - main - nvmf: Add a transport hook to limit the size of host data transfers List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 01dd6a83b5ffce7a99ab8a7c2c9dcb82088357cd Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=01dd6a83b5ffce7a99ab8a7c2c9dcb82088357cd commit 01dd6a83b5ffce7a99ab8a7c2c9dcb82088357cd Author: John Baldwin AuthorDate: 2025-11-10 15:50:47 +0000 Commit: John Baldwin CommitDate: 2025-11-10 15:50:47 +0000 nvmf: Add a transport hook to limit the size of host data transfers Smart NIC offload transports may have a cap on the size of the largest data PDU that can be received. Allow these transports to enforce a cap on the size of an I/O request submitted by the nvmf(4) host. NB: The controller is able to advertise a maximum-supported PDU size during TCP negotiation, but there is no way in the protocol to advertise a maximum size that the host can receive. Sponsored by: Chelsio Communications --- sys/dev/nvmf/nvmf_tcp.c | 7 +++++++ sys/dev/nvmf/nvmf_transport.c | 6 ++++++ sys/dev/nvmf/nvmf_transport.h | 8 ++++++++ sys/dev/nvmf/nvmf_transport_internal.h | 3 +++ 4 files changed, 24 insertions(+) diff --git a/sys/dev/nvmf/nvmf_tcp.c b/sys/dev/nvmf/nvmf_tcp.c index e50d7ff48d2b..0e31c0495775 100644 --- a/sys/dev/nvmf/nvmf_tcp.c +++ b/sys/dev/nvmf/nvmf_tcp.c @@ -1602,6 +1602,12 @@ tcp_free_qpair(struct nvmf_qpair *nq) tcp_release_qpair(qp); } +static uint64_t +tcp_max_xfer_size(struct nvmf_qpair *nq) +{ + return (0); +} + static struct nvmf_capsule * tcp_allocate_capsule(struct nvmf_qpair *nq, int how) { @@ -1872,6 +1878,7 @@ tcp_send_controller_data(struct nvmf_capsule *nc, uint32_t data_offset, struct nvmf_transport_ops tcp_ops = { .allocate_qpair = tcp_allocate_qpair, .free_qpair = tcp_free_qpair, + .max_xfer_size = tcp_max_xfer_size, .allocate_capsule = tcp_allocate_capsule, .free_capsule = tcp_free_capsule, .transmit_capsule = tcp_transmit_capsule, diff --git a/sys/dev/nvmf/nvmf_transport.c b/sys/dev/nvmf/nvmf_transport.c index 1d3f5ea4cf69..d552393f7adf 100644 --- a/sys/dev/nvmf/nvmf_transport.c +++ b/sys/dev/nvmf/nvmf_transport.c @@ -188,6 +188,12 @@ nvmf_sqhd_valid(struct nvmf_capsule *nc) return (nc->nc_sqhd_valid); } +uint64_t +nvmf_max_xfer_size(struct nvmf_qpair *qp) +{ + return (qp->nq_ops->max_xfer_size(qp)); +} + uint8_t nvmf_validate_command_capsule(struct nvmf_capsule *nc) { diff --git a/sys/dev/nvmf/nvmf_transport.h b/sys/dev/nvmf/nvmf_transport.h index b192baeaccc1..38b661ab3c91 100644 --- a/sys/dev/nvmf/nvmf_transport.h +++ b/sys/dev/nvmf/nvmf_transport.h @@ -81,6 +81,14 @@ void *nvmf_capsule_sqe(struct nvmf_capsule *nc); void *nvmf_capsule_cqe(struct nvmf_capsule *nc); bool nvmf_sqhd_valid(struct nvmf_capsule *nc); +/* Host-specific APIs. */ + +/* + * Largest I/O request size for a single command supported by the + * transport. If the transport does not have a limit, returns 0. + */ +uint64_t nvmf_max_xfer_size(struct nvmf_qpair *qp); + /* Controller-specific APIs. */ /* diff --git a/sys/dev/nvmf/nvmf_transport_internal.h b/sys/dev/nvmf/nvmf_transport_internal.h index eb819a5c83b9..511aac120fdc 100644 --- a/sys/dev/nvmf/nvmf_transport_internal.h +++ b/sys/dev/nvmf/nvmf_transport_internal.h @@ -25,6 +25,9 @@ struct nvmf_transport_ops { const nvlist_t *nvl); void (*free_qpair)(struct nvmf_qpair *qp); + /* Limit on transfer size. */ + uint64_t (*max_xfer_size)(struct nvmf_qpair *qp); + /* Capsule operations. */ struct nvmf_capsule *(*allocate_capsule)(struct nvmf_qpair *qp, int how);