mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 13:30:45 -05:00
selftests: drv-net: wait for carrier
On fast machines the tests run in quick succession so even when tests clean up after themselves the carrier may need some time to come back. Specifically in NIPA when ping.py runs right after netpoll_basic.py the first ping command fails. Since the context manager callbacks are now common NetDrvEpEnv gets an ip link up call as well. Reviewed-by: Joe Damato <joe@dama.to> Link: https://patch.msgid.link/20250812142054.750282-1-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -15,7 +15,7 @@ try:
|
||||
NlError, RtnlFamily, DevlinkFamily
|
||||
from net.lib.py import CmdExitFailure
|
||||
from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \
|
||||
fd_read_timeout, ip, rand_port, tool, wait_port_listen
|
||||
fd_read_timeout, ip, rand_port, tool, wait_port_listen, wait_file
|
||||
from net.lib.py import fd_read_timeout
|
||||
from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx
|
||||
from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \
|
||||
|
||||
@@ -4,7 +4,7 @@ import os
|
||||
import time
|
||||
from pathlib import Path
|
||||
from lib.py import KsftSkipEx, KsftXfailEx
|
||||
from lib.py import ksft_setup
|
||||
from lib.py import ksft_setup, wait_file
|
||||
from lib.py import cmd, ethtool, ip, CmdExitFailure
|
||||
from lib.py import NetNS, NetdevSimDev
|
||||
from .remote import Remote
|
||||
@@ -25,6 +25,9 @@ class NetDrvEnvBase:
|
||||
|
||||
self.env = self._load_env_file()
|
||||
|
||||
# Following attrs must be set be inheriting classes
|
||||
self.dev = None
|
||||
|
||||
def _load_env_file(self):
|
||||
env = os.environ.copy()
|
||||
|
||||
@@ -48,6 +51,22 @@ class NetDrvEnvBase:
|
||||
env[pair[0]] = pair[1]
|
||||
return ksft_setup(env)
|
||||
|
||||
def __del__(self):
|
||||
pass
|
||||
|
||||
def __enter__(self):
|
||||
ip(f"link set dev {self.dev['ifname']} up")
|
||||
wait_file(f"/sys/class/net/{self.dev['ifname']}/carrier",
|
||||
lambda x: x.strip() == "1")
|
||||
|
||||
return self
|
||||
|
||||
def __exit__(self, ex_type, ex_value, ex_tb):
|
||||
"""
|
||||
__exit__ gets called at the end of a "with" block.
|
||||
"""
|
||||
self.__del__()
|
||||
|
||||
|
||||
class NetDrvEnv(NetDrvEnvBase):
|
||||
"""
|
||||
@@ -72,17 +91,6 @@ class NetDrvEnv(NetDrvEnvBase):
|
||||
self.ifname = self.dev['ifname']
|
||||
self.ifindex = self.dev['ifindex']
|
||||
|
||||
def __enter__(self):
|
||||
ip(f"link set dev {self.dev['ifname']} up")
|
||||
|
||||
return self
|
||||
|
||||
def __exit__(self, ex_type, ex_value, ex_tb):
|
||||
"""
|
||||
__exit__ gets called at the end of a "with" block.
|
||||
"""
|
||||
self.__del__()
|
||||
|
||||
def __del__(self):
|
||||
if self._ns:
|
||||
self._ns.remove()
|
||||
@@ -219,15 +227,6 @@ class NetDrvEpEnv(NetDrvEnvBase):
|
||||
raise Exception("Can't resolve remote interface name, multiple interfaces match")
|
||||
return v6[0]["ifname"] if v6 else v4[0]["ifname"]
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, ex_type, ex_value, ex_tb):
|
||||
"""
|
||||
__exit__ gets called at the end of a "with" block.
|
||||
"""
|
||||
self.__del__()
|
||||
|
||||
def __del__(self):
|
||||
if self._ns:
|
||||
self._ns.remove()
|
||||
|
||||
@@ -252,3 +252,21 @@ def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadlin
|
||||
if time.monotonic() > end:
|
||||
raise Exception("Waiting for port listen timed out")
|
||||
time.sleep(sleep)
|
||||
|
||||
|
||||
def wait_file(fname, test_fn, sleep=0.005, deadline=5, encoding='utf-8'):
|
||||
"""
|
||||
Wait for file contents on the local system to satisfy a condition.
|
||||
test_fn() should take one argument (file contents) and return whether
|
||||
condition is met.
|
||||
"""
|
||||
end = time.monotonic() + deadline
|
||||
|
||||
with open(fname, "r", encoding=encoding) as fp:
|
||||
while True:
|
||||
if test_fn(fp.read()):
|
||||
break
|
||||
fp.seek(0)
|
||||
if time.monotonic() > end:
|
||||
raise TimeoutError("Wait for file contents failed", fname)
|
||||
time.sleep(sleep)
|
||||
|
||||
Reference in New Issue
Block a user