mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: netdev-bot+sashiko@kernel.org
To: sdf.kernel@gmail.com
Cc: netdev@vger.kernel.org, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, andrew+netdev@lunn.ch,
	edumazet@kernel.org, horms@kernel.org, corbet@lwn.net,
	skhan@linuxfoundation.org, rdunlap@infradead.org,
	michael.chan@broadcom.com, pavan.chebbi@broadcom.com,
	saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com,
	alexanderduyck@fb.com, kernel-team@meta.com, sdf@fomichev.me,
	dimitri.daskalakis1@gmail.com, almasrymina@google.com,
	dtatulea@nvidia.com, bobbyeshleman@meta.com,
	asml.silence@gmail.com, daniel@iogearbox.net,
	razor@blackwall.org, leitao@debian.org,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-rdma@vger.kernel.org, linux-kselftest@vger.kernel.org,
	leon@kernel.org
Subject: Re: [PATCH net-next v3 8/9] net: devmem: size TX net_iovs from the dmabuf sg table
Date: Mon, 09 Nov 2026 01:23:04 +0000	[thread overview]
Message-ID: <179418738408.994134.12387400537759262351@kernel.org> (raw)
In-Reply-To: <20261105222058.944293-9-sdf@fomichev.me>

Thank you for your contribution! Sashiko AI review found 1 potential
issue(s) to consider.

Critical: 0 · High: 0 · Medium: 1 · Low: 0

If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).

- [Medium] This patch makes TX net_iovs grow from PAGE_SIZE to as much as
  2MB.

--

net: devmem: size TX net_iovs from the dmabuf sg table

This patch changes how TX net_iovs are sized. Instead of PAGE_SIZE, each
TX net_iov is now the largest power of two from PAGE_SIZE up to 2MB that
aligns both the dmabuf size and every DMA segment in the sg table.
netdev_nl_bind_tx_doit() passes niov_shift == 0 to ask for this, so that
BIG TCP can build larger frags.

> diff --git a/net/core/devmem.c b/net/core/devmem.c
> index b607cf495980c..74de200f66be2 100644
> --- a/net/core/devmem.c
> +++ b/net/core/devmem.c

[ ... ]

> @@ -388,6 +401,17 @@ net_devmem_bind_dmabuf(struct net_device *dev, void *vdev,
>  		goto err_unmap;
>  	}
>  
> +	if (!niov_shift) {
> +		niov_size = SZ_2M;
> +		while (niov_size > PAGE_SIZE &&
> +		       (!IS_ALIGNED(dmabuf->size, niov_size) ||
> +			!net_devmem_sgt_aligned(binding->sgt, niov_size)))
> +			niov_size /= 2;
> +		niov_shift = ilog2(niov_size);
> +	}
> +	binding->niov_shift = niov_shift;
> +	niov_size = 1UL << niov_shift;
> +

[Severity: Medium]
netdev_nl_bind_tx_doit() now passes niov_shift == 0, so a hugepage-backed
dmabuf gets 2MB TX net_iovs. Can a devmem TX frag then end up larger than
dev->netmem_tx_max_frag_size?

The cap is only applied when a frag is first built:

net/core/datagram.c:zerocopy_fill_skb_from_devmem() {
    ...
		size = min_t(size_t, size, binding->tx_max_frag_size);
    ...
}

Later, tcp_mtu_probe()->tcp_clone_payload() merges contiguous frags and
never checks the binding's limit:

net/ipv4/tcp_output.c:tcp_clone_payload() {
    ...
			if (lastfrag &&
			    skb_frag_page(fragfrom) == skb_frag_page(lastfrag) &&
			    skb_frag_off(fragfrom) == skb_frag_off(lastfrag) +
						      skb_frag_size(lastfrag)) {
				skb_frag_size_add(lastfrag, todo);
				continue;
			}
    ...
}

Before this patch, contiguous frags inside one net_iov could add up to at
most PAGE_SIZE. That is also the default netmem_tx_max_frag_size, so a
merged frag still stayed within the cap.

With 2MB net_iovs, contiguous TCP segments in the same net_iov can be
merged into one frag of up to probe_size bytes. On a path whose MTU is
above PAGE_SIZE, that frag is larger than the limit the device declared.

Documentation/networking/netmem.rst says:

    3. Devmem TX frags are capped at netdev->netmem_tx_max_frag_size,
       PAGE_SIZE by default.

The commit message says:

    frags are capped to the device limit when they are built

Is a cap applied only at build time enough to keep that contract?

The other merge paths are tcp_grow_skb() and SACK shifting. Both go
through skb_shift(), which bails out on skb_zcopy(), so tcp_clone_payload()
looks like the only path left.

All of these are needed to reach it:

  - an unprivileged bind-tx (NETDEV_CMD_BIND_TX has no GENL_ADMIN_PERM)
  - MTU probing turned on (tcp_mtu_probing=2, or 1 after black hole
    detection)
  - a path MTU above the device's frag limit

I could not find an in-tree driver that breaks today:

  - gve keeps the PAGE_SIZE default but splits buffers at
    GVE_TX_MAX_BUF_SIZE_DQO
  - bnxt and fbnic use 32K
  - mlx5 uses U32_MAX

A driver that relies on the documented cap would still get a frag larger
than it declared.

There is also a related issue in the same code. It is pre-existing and
was not introduced by this patch.

skb_frag_page() returns NULL for every net_iov frag. So for devmem frags
the skb_frag_page() comparison above is always true, even when the frags
come from different net_iovs.

Suppose the next frag's offset inside its net_iov equals the end offset
of lastfrag inside its own net_iov. Then lastfrag is extended over bytes
from the wrong net_iov, and the wrong dmabuf data is sent under real
sequence numbers. The extended range stays inside the first net_iov, so
there is no DMA outside the dmabuf.

Would either of these fix both problems:

  - compare skb_frag_netmem() and apply binding->tx_max_frag_size in
    tcp_clone_payload()
  - don't coalesce unreadable skbs when building MTU probes

[ ... ]

-- 
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261105222058.944293-1-sdf%40fomichev.me

  reply	other threads:[~2026-11-09  1:23 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-05 22:20 [PATCH net-next v3 0/9] net: devmem: size TX net_iovs from the dmabuf layout Stanislav Fomichev
2026-11-05 22:20 ` [PATCH net-next v3 1/9] bnxt_en: let the stack segment GSO skbs with too many frags Stanislav Fomichev
2026-11-09  1:22   ` netdev-bot+sashiko
2026-11-05 22:20 ` [PATCH net-next v3 2/9] net: devmem: charge the frag length to TX skb truesize Stanislav Fomichev
2026-11-09  1:22   ` netdev-bot+sashiko
2026-11-05 22:20 ` [PATCH net-next v3 3/9] net: devmem: use niov_shift in net_devmem_get_niov_at() Stanislav Fomichev
2026-11-05 22:20 ` [PATCH net-next v3 4/9] net: devmem: add a per-device netmem TX frag size limit Stanislav Fomichev
2026-11-09  1:22   ` netdev-bot+sashiko
2026-11-05 22:20 ` [PATCH net-next v3 5/9] bnxt_en: set the netmem TX frag size limit to 32KB Stanislav Fomichev
2026-11-09  1:22   ` netdev-bot+sashiko
2026-11-05 22:20 ` [PATCH net-next v3 6/9] eth: fbnic: " Stanislav Fomichev
2026-11-05 22:20 ` [PATCH net-next v3 7/9] net/mlx5e: lift the netmem TX frag size limit Stanislav Fomichev
2026-11-09  1:23   ` netdev-bot+sashiko
2026-11-05 22:20 ` [PATCH net-next v3 8/9] net: devmem: size TX net_iovs from the dmabuf sg table Stanislav Fomichev
2026-11-09  1:23   ` netdev-bot+sashiko [this message]
2026-11-05 22:20 ` [PATCH net-next v3 9/9] selftests: drv-net: devmem: TX from a hugepage-backed dmabuf Stanislav Fomichev
2026-11-09  1:23   ` netdev-bot+sashiko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=179418738408.994134.12387400537759262351@kernel.org \
    --to=netdev-bot+sashiko@kernel.org \
    --cc=alexanderduyck@fb.com \
    --cc=almasrymina@google.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=asml.silence@gmail.com \
    --cc=bobbyeshleman@meta.com \
    --cc=corbet@lwn.net \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=dimitri.daskalakis1@gmail.com \
    --cc=dtatulea@nvidia.com \
    --cc=edumazet@google.com \
    --cc=edumazet@kernel.org \
    --cc=horms@kernel.org \
    --cc=kernel-team@meta.com \
    --cc=kuba@kernel.org \
    --cc=leitao@debian.org \
    --cc=leon@kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=mbloch@nvidia.com \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=pavan.chebbi@broadcom.com \
    --cc=razor@blackwall.org \
    --cc=rdunlap@infradead.org \
    --cc=saeedm@nvidia.com \
    --cc=sdf.kernel@gmail.com \
    --cc=sdf@fomichev.me \
    --cc=skhan@linuxfoundation.org \
    --cc=tariqt@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®