The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=909e2d7b691f7418a78b1289a51d3b6c46860a9b

commit 909e2d7b691f7418a78b1289a51d3b6c46860a9b
Author:     Jasper Tran O'Leary <jtranole...@google.com>
AuthorDate: 2025-02-14 14:57:06 +0000
Commit:     Mark Johnston <ma...@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 <jtranole...@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)

Reply via email to