Message ID | 20240625010210.2002310-3-kuba@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | selftests: drv-net: rss_ctx: add tests for RSS contexts | expand |
Jakub Kicinski <kuba@kernel.org> writes: > Some devices DMA stats to the host periodically. Add a helper > which can wait for that to happen, based on frequency reported > by the driver in ethtool. > > Signed-off-by: Jakub Kicinski <kuba@kernel.org> > --- > v2: > - sleep for 25ms on top of the driver DMA period > (and remove confusing comment) > --- > .../selftests/drivers/net/lib/py/env.py | 20 ++++++++++++++++++- > tools/testing/selftests/net/lib/py/utils.py | 4 ++++ > 2 files changed, 23 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/testing/selftests/drivers/net/lib/py/env.py > index edcedd7bffab..16d24fe7107d 100644 > --- a/tools/testing/selftests/drivers/net/lib/py/env.py > +++ b/tools/testing/selftests/drivers/net/lib/py/env.py > @@ -1,9 +1,10 @@ > # SPDX-License-Identifier: GPL-2.0 > > import os > +import time > from pathlib import Path > from lib.py import KsftSkipEx, KsftXfailEx > -from lib.py import cmd, ip > +from lib.py import cmd, ethtool, ip > from lib.py import NetNS, NetdevSimDev > from .remote import Remote > > @@ -82,6 +83,8 @@ from .remote import Remote > > self.env = _load_env_file(src_path) > > + self._stats_settle_time = None > + > # Things we try to destroy > self.remote = None > # These are for local testing state > @@ -222,3 +225,18 @@ from .remote import Remote > if remote: > if not self._require_cmd(comm, "remote"): > raise KsftSkipEx("Test requires (remote) command: " + comm) > + > + def wait_hw_stats_settle(self): > + """ > + Wait for HW stats to become consistent, some devices DMA HW stats > + periodically so events won't be reflected until next sync. > + Good drivers will tell us via ethtool what their sync period is. > + """ > + if self._stats_settle_time is None: > + self._stats_settle_time = 0.025 > + > + data = ethtool("-c " + self.ifname, json=True)[0] > + if 'stats-block-usecs' in data: > + self._stats_settle_time += data['stats-block-usecs'] / 1000 / 1000 If there's a v3, this dual check-then-access could be folded into a .get() and the whole expression then gets a bit simpler: data = ethtool("-c " + self.ifname, json=True)[0] self._stats_settle_time = 0.25 + \ data.get('stats-block-usecs', 0) / 1000 / 1000 > + > + time.sleep(self._stats_settle_time) > diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/selftests/net/lib/py/utils.py > index 16907b51e034..11dbdd3b7612 100644 > --- a/tools/testing/selftests/net/lib/py/utils.py > +++ b/tools/testing/selftests/net/lib/py/utils.py > @@ -78,6 +78,10 @@ import time > return tool('ip', args, json=json, host=host) > > > +def ethtool(args, json=None, ns=None, host=None): > + return tool('ethtool', args, json=json, ns=ns, host=host) Double space here. > + > + > def rand_port(): > """ > Get a random unprivileged port, try to make sure it's not already used.
diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/testing/selftests/drivers/net/lib/py/env.py index edcedd7bffab..16d24fe7107d 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -1,9 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 import os +import time from pathlib import Path from lib.py import KsftSkipEx, KsftXfailEx -from lib.py import cmd, ip +from lib.py import cmd, ethtool, ip from lib.py import NetNS, NetdevSimDev from .remote import Remote @@ -82,6 +83,8 @@ from .remote import Remote self.env = _load_env_file(src_path) + self._stats_settle_time = None + # Things we try to destroy self.remote = None # These are for local testing state @@ -222,3 +225,18 @@ from .remote import Remote if remote: if not self._require_cmd(comm, "remote"): raise KsftSkipEx("Test requires (remote) command: " + comm) + + def wait_hw_stats_settle(self): + """ + Wait for HW stats to become consistent, some devices DMA HW stats + periodically so events won't be reflected until next sync. + Good drivers will tell us via ethtool what their sync period is. + """ + if self._stats_settle_time is None: + self._stats_settle_time = 0.025 + + data = ethtool("-c " + self.ifname, json=True)[0] + if 'stats-block-usecs' in data: + self._stats_settle_time += data['stats-block-usecs'] / 1000 / 1000 + + time.sleep(self._stats_settle_time) diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/selftests/net/lib/py/utils.py index 16907b51e034..11dbdd3b7612 100644 --- a/tools/testing/selftests/net/lib/py/utils.py +++ b/tools/testing/selftests/net/lib/py/utils.py @@ -78,6 +78,10 @@ import time return tool('ip', args, json=json, host=host) +def ethtool(args, json=None, ns=None, host=None): + return tool('ethtool', args, json=json, ns=ns, host=host) + + def rand_port(): """ Get a random unprivileged port, try to make sure it's not already used.
Some devices DMA stats to the host periodically. Add a helper which can wait for that to happen, based on frequency reported by the driver in ethtool. Signed-off-by: Jakub Kicinski <kuba@kernel.org> --- v2: - sleep for 25ms on top of the driver DMA period (and remove confusing comment) --- .../selftests/drivers/net/lib/py/env.py | 20 ++++++++++++++++++- tools/testing/selftests/net/lib/py/utils.py | 4 ++++ 2 files changed, 23 insertions(+), 1 deletion(-)