git: 909e2d7b691f - main - gve: Disallow MTUs within a problematic range
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 14 Feb 2025 15:10:56 UTC
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)