[PATCH net-next v2 2/3] selftests: drv-net: Check the features set by set_ethtool_feat()

From: Ovidiu Panait

Date: Fri Sep 18 2026 - 07:56:19 EST


Read back the features after running ethtool -K to check if they were
actually applied. The drivers might refuse to set a feature silently and
the test could run with a different configuration than the requested one.

Add a 'check' parameter to skip this, as the GRO "hw" mode handles the
case where HW GRO is cleared by the driver.

Signed-off-by: Ovidiu Panait <ovidiu.panait.rb@xxxxxxxxxxx>
---
v2: New patch.

tools/testing/selftests/drivers/net/gro_lib.py | 3 ++-
tools/testing/selftests/drivers/net/lib/py/feat.py | 10 +++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/drivers/net/gro_lib.py b/tools/testing/selftests/drivers/net/gro_lib.py
index 7856ebdd49d3..875a715b2ae1 100644
--- a/tools/testing/selftests/drivers/net/gro_lib.py
+++ b/tools/testing/selftests/drivers/net/gro_lib.py
@@ -263,7 +263,8 @@ def _setup(cfg, mode, test_name):
set_ethtool_feat(cfg.ifname, cfg.feat,
{"generic-receive-offload": False,
"rx-gro-hw": True,
- "large-receive-offload": False})
+ "large-receive-offload": False},
+ check=False)

# Some NICs treat HW GRO as a GRO sub-feature so disabling GRO
# will also clear HW GRO. Use a hack of installing XDP generic
diff --git a/tools/testing/selftests/drivers/net/lib/py/feat.py b/tools/testing/selftests/drivers/net/lib/py/feat.py
index b94a24214e59..f0630844f023 100644
--- a/tools/testing/selftests/drivers/net/lib/py/feat.py
+++ b/tools/testing/selftests/drivers/net/lib/py/feat.py
@@ -9,7 +9,7 @@ Provides common operations for changing device features via ethtool.
from . import KsftXfailEx, defer, ethtool, ksft_pr


-def set_ethtool_feat(dev, current, feats, host=None):
+def set_ethtool_feat(dev, current, feats, host=None, check=True):
"""Set ethtool features with defer to restore original state."""
s2n = {True: "on", False: "off"}

@@ -33,3 +33,11 @@ def set_ethtool_feat(dev, current, feats, host=None):
# If ethtool printed something kernel must have modified some features
if eth_cmd.stdout:
ksft_pr(eth_cmd)
+
+ if not check:
+ return
+
+ current = ethtool(f"-k {dev}", json=True, host=host)[0]
+ for name, state in feats.items():
+ if current[name]["active"] != state:
+ raise KsftXfailEx(f"{name} was not set to {s2n[state]}")
--
2.34.1