]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: mana: Fall back to standard MTU when PF reports adapter_mtu of 0
authorErni Sri Satya Vennela <ernis@linux.microsoft.com>
Fri, 19 Jun 2026 05:53:38 +0000 (22:53 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 25 Jun 2026 00:56:44 +0000 (17:56 -0700)
Commit d7709812e13d ("net: mana: hardening: Validate adapter_mtu from
MANA_QUERY_DEV_CONFIG") rejected any adapter_mtu value smaller than
ETH_MIN_MTU + ETH_HLEN, including 0, returning -EPROTO and failing
mana_probe().

Some older PF firmware versions still in the field report
adapter_mtu as 0 in the MANA_QUERY_DEV_CONFIG response. With the
hardening check in place, the MANA VF driver now fails to load on
those hosts, breaking networking entirely for guests.

MANA hardware always supports the standard Ethernet MTU. Treat a
reported adapter_mtu of 0 as "the PF did not advertise a value" and
fall back to ETH_FRAME_LEN, the same value used for the pre-V2
message version path. Only jumbo frames remain unavailable until
the PF reports a valid MTU.

Other small-but-nonzero bogus values are still rejected, preserving
the original protection against the unsigned-subtraction wrap that
would otherwise let ndev->max_mtu underflow to a huge value.

Fixes: d7709812e13d ("net: mana: hardening: Validate adapter_mtu from MANA_QUERY_DEV_CONFIG")
Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260619055348.467224-1-ernis@linux.microsoft.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microsoft/mana/mana_bpf.c
drivers/net/ethernet/microsoft/mana/mana_en.c

index b5e9bb184a1dd37e3e21ca547c5d710efd4d8506..53308e139cbe917b074dd381c83546fc74d7b79f 100644 (file)
@@ -237,7 +237,8 @@ static int mana_xdp_set(struct net_device *ndev, struct bpf_prog *prog,
                bpf_prog_put(old_prog);
 
        if (prog)
-               ndev->max_mtu = MANA_XDP_MTU_MAX;
+               ndev->max_mtu = min_t(unsigned int, MANA_XDP_MTU_MAX,
+                                     gc->adapter_mtu - ETH_HLEN);
        else
                ndev->max_mtu = gc->adapter_mtu - ETH_HLEN;
 
index 87862b0434c76e3ba9e18cfb4f445814ca9eafc3..7438ea6b3f266e31aaadadbe351785dc8357336b 100644 (file)
@@ -1233,12 +1233,24 @@ int mana_gd_query_device_cfg(struct gdma_context *gc, u32 proto_major_ver,
        *max_num_vports = resp.max_num_vports;
 
        if (resp.hdr.response.msg_version >= GDMA_MESSAGE_V2) {
-               if (resp.adapter_mtu < ETH_MIN_MTU + ETH_HLEN) {
+               if (resp.adapter_mtu == 0) {
+                       /*
+                        * Some older PF firmware versions report an
+                        * adapter_mtu of 0. MANA hardware always supports the
+                        * standard Ethernet MTU, so fall back to ETH_FRAME_LEN.
+                        * Jumbo frames will not be available in this case.
+                        */
+                       dev_info(dev,
+                                "PF reported adapter_mtu of 0, falling back to %u (jumbo frames disabled)\n",
+                                ETH_FRAME_LEN);
+                       gc->adapter_mtu = ETH_FRAME_LEN;
+               } else if (resp.adapter_mtu < ETH_MIN_MTU + ETH_HLEN) {
                        dev_err(dev, "Adapter MTU too small: %u\n",
                                resp.adapter_mtu);
                        return -EPROTO;
+               } else {
+                       gc->adapter_mtu = resp.adapter_mtu;
                }
-               gc->adapter_mtu = resp.adapter_mtu;
        } else {
                gc->adapter_mtu = ETH_FRAME_LEN;
        }