Mon, Apr 22, 2019 at 09:31:33PM CEST, jakub.kicin...@netronome.com wrote: >On Sat, 20 Apr 2019 12:29:21 +0200, Jiri Pirko wrote: >> diff --git a/tools/testing/selftests/bpf/test_offload.py >> b/tools/testing/selftests/bpf/test_offload.py >> index 5f2e4f9e70e4..a0566dcf064a 100755 >> --- a/tools/testing/selftests/bpf/test_offload.py >> +++ b/tools/testing/selftests/bpf/test_offload.py >> @@ -1,6 +1,7 @@ >> #!/usr/bin/python3 >> >> # Copyright (C) 2017 Netronome Systems, Inc. >> +# Copyright (c) 2019 Mellanox Technologies. All rights reserved > >What's your guiding principle with adding those copyright lines >everywhere?
Semi-random :) I can remove it if you want. > >> # This software is licensed under the GNU General License Version 2, >> # June 1991 as shown in the file COPYING in the top-level directory of this >> @@ -24,6 +25,7 @@ import struct >> import subprocess >> import time >> import traceback >> +import errno > >aphabetic order. Ok. > >> >> logfile = None >> log_level = 1 >> @@ -323,42 +325,85 @@ class DebugfsDir: >> >> return dfs >> >> -class NetdevSim: >> +class NetdevSimDev: >> """ >> - Class for netdevsim netdevice and its attributes. >> + Class for netdevsim bus device and its attributes. >> """ >> >> - def __init__(self, link=None): >> - self.link = link >> + def __init__(self, port_count=1): >> + addr = 0 >> + while True: >> + try: >> + with open("/sys/bus/netdevsim/new_device","w") as f: > >space after , Ok. > >> + f.write("%u %u" % (addr, port_count)) >> + except OSError as e: >> + if e.errno == errno.ENOSPC: >> + addr += 1 >> + continue >> + raise e >> + break >> >> - self.dev = self._netdevsim_create() >> devs.append(self) >> + self.addr = addr >> + self.dfs_dir = "/sys/kernel/debug/netdevsim/netdevsim%u/" % addr >> >> - self.ns = "" >> + self.nsims = [] >> + for port_index in range(port_count): >> + self.nsims.append(NetdevSim(self, port_index)) >> >> - self.dfs_dir = '/sys/kernel/debug/netdevsim/netdevsim0/ports/0/' >> - self.dev_dir = self.dfs_dir + '/dev/' >> - self.dfs_refresh() >> + def dfs_num_bound_progs(self): >> + path = os.path.join(self.dfs_dir, "bpf_bound_progs") >> + _, progs = cmd('ls %s' % (path)) >> + return len(progs.split()) >> >> - def __getitem__(self, key): >> - return self.dev[key] >> + def dfs_get_bound_progs(self, expected): >> + progs = DebugfsDir(os.path.join(self.dfs_dir, "bpf_bound_progs")) >> + if expected is not None: >> + if len(progs) != expected: >> + fail(True, "%d BPF programs bound, expected %d" % >> + (len(progs), expected)) >> + return progs >> >> - def _netdevsim_create(self): >> - link = "" if self.link is None else "link " + >> self.link.dev['ifname'] >> - _, old = ip("link show") >> - ip("link add sim%d {link} type netdevsim".format(link=link)) >> - _, new = ip("link show") >> + def remove(self): >> + with open("/sys/bus/netdevsim/del_device","w") as f: > >and here, etc. ok > >> + f.write("%u" % self.addr) >> + devs.remove(self) >> >> - for dev in new: >> - f = filter(lambda x: x["ifname"] == dev["ifname"], old) >> - if len(list(f)) == 0: >> - return dev >> + def remove_nsim(self, nsim): >> + self.nsims.remove(nsim) >> + with open("/sys/bus/netdevsim/devices/netdevsim%u/del_port" % >> self.addr ,"w") as f: >> + f.write("%u" % nsim.port_index) >> >> - raise Exception("failed to create netdevsim device") >> +class NetdevSim: >> + """ >> + Class for netdevsim netdevice and its attributes. >> + """ >> + >> + def __init__(self, nsimdev, port_index): >> + self.nsimdev = nsimdev >> + self.port_index = port_index >> + self.ns = "" >> + self.dfs_dir = "%s/ports/%u/" % (nsimdev.dfs_dir, port_index) >> + self.dfs_refresh() >> + >> + ifname = "eni%unp%u" % (nsimdev.addr, port_index + 1) >> + timeout = 0.5 >> + timeout_start = time.time() >> + >> + while True: >> + try: >> + _, [self.dev] = ip("link show dev %s" % ifname) >> + except Exception as e: >> + if time.time() < timeout_start + timeout: >> + continue >> + raise e >> + break > >udevadm settle? The reliance on latest systemd is a real bad idea, Not sure that "udevadm settle" would help here. The diver bus probe handle may be executed from a workqueue, so here, there might be the udev event queue empty yet still the netdev is not present. >could you fall back to netdevsimX names if eni$SOME$CUFT is not found? That would not help. If you have udev which does not support this, you are going to endup with "eth0, eth1, .." > >> + def __getitem__(self, key): >> + return self.dev[key] >> >> def remove(self): >> - devs.remove(self) >> - ip("link del dev %s" % (self.dev["ifname"]), ns=self.ns) >> + self.nsimdev.remove_nsim(self) >> >> def dfs_refresh(self): >> self.dfs = DebugfsDir(self.dfs_dir)