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 <[email protected]>
---
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


Reply via email to