Date: Fri, 14 Feb 2025 15:10:56 GMT From: Mark Johnston <markj@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 909e2d7b691f - main - gve: Disallow MTUs within a problematic range Message-ID: <202502141510.51EFAua5063288@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=909e2d7b691f7418a78b1289a51d3b6c46860a9b commit 909e2d7b691f7418a78b1289a51d3b6c46860a9b Author: Jasper Tran O'Leary <jtranoleary@google.com> AuthorDate: 2025-02-14 14:57:06 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2025-02-14 14:57:06 +0000 gve: Disallow MTUs within a problematic range If hardware LRO is enabled with GVE, then setting the driver's MTU to a range of values around 8000 will cause dropped packets and drastically degraded performance. While this issue is being investigated, we need to prohibit the driver's MTU being set to a value within this range. Signed-off-by: Jasper Tran O'Leary <jtranoleary@google.com> Reviewed by: delphij, markj MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D48971 --- sys/dev/gve/gve_main.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sys/dev/gve/gve_main.c b/sys/dev/gve/gve_main.c index 0e40656ca928..c726177c199c 100644 --- a/sys/dev/gve/gve_main.c +++ b/sys/dev/gve/gve_main.c @@ -196,6 +196,8 @@ static int gve_set_mtu(if_t ifp, uint32_t new_mtu) { struct gve_priv *priv = if_getsoftc(ifp); + const uint32_t max_problem_range = 8227; + const uint32_t min_problem_range = 7822; int err; if ((new_mtu > priv->max_mtu) || (new_mtu < ETHERMIN)) { @@ -204,6 +206,19 @@ gve_set_mtu(if_t ifp, uint32_t new_mtu) return (EINVAL); } + /* + * When hardware LRO is enabled in DQ mode, MTUs within the range + * [7822, 8227] trigger hardware issues which cause a drastic drop + * in throughput. + */ + if (!gve_is_gqi(priv) && !gve_disable_hw_lro && + new_mtu >= min_problem_range && new_mtu <= max_problem_range) { + device_printf(priv->dev, + "Cannot set to MTU to %d within the range [%d, %d] while hardware LRO is enabled\n", + new_mtu, min_problem_range, max_problem_range); + return (EINVAL); + } + err = gve_adminq_set_mtu(priv, new_mtu); if (err == 0) { if (bootverbose)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202502141510.51EFAua5063288>