ACK: [J/K][L][SRU][PATCH 1/1] selftests: net: devlink_port_split.py: skip test if no suitable device available

Roxana Nicolescu roxana.nicolescu at canonical.com
Mon Mar 20 08:23:45 UTC 2023


On 20/03/2023 04:59, Po-Hsu Lin wrote:
> BugLink: https://bugs.launchpad.net/bugs/1937133
>
> The `devlink -j port show` command output may not contain the "flavour"
> key, an example from Ubuntu 22.10 s390x LPAR(5.19.0-37-generic), with
> mlx4 driver and iproute2-5.15.0:
>    {"port":{"pci/0001:00:00.0/1":{"type":"eth","netdev":"ens301"},
>             "pci/0001:00:00.0/2":{"type":"eth","netdev":"ens301d1"},
>             "pci/0002:00:00.0/1":{"type":"eth","netdev":"ens317"},
>             "pci/0002:00:00.0/2":{"type":"eth","netdev":"ens317d1"}}}
>
> This will cause a KeyError exception.
>
> Create a validate_devlink_output() to check for this "flavour" from
> devlink command output to avoid this KeyError exception. Also let
> it handle the check for `devlink -j dev show` output in main().
>
> Apart from this, if the test was not started because the max lanes of
> the designated device is 0. The script will still return 0 and thus
> causing a false-negative test result.
>
> Use a found_max_lanes flag to determine if these tests were skipped
> due to this reason and return KSFT_SKIP to make it more clear.
>
> Link: https://bugs.launchpad.net/bugs/1937133
> Fixes: f3348a82e727 ("selftests: net: Add port split test")
> Signed-off-by: Po-Hsu Lin <po-hsu.lin at canonical.com>
> Link: https://lore.kernel.org/r/20230315165353.229590-1-po-hsu.lin@canonical.com
> Signed-off-by: Jakub Kicinski <kuba at kernel.org>
> (cherry picked from commit 3de66d08d37a565eba1adfe1e107593cae978a20)
> Signed-off-by: Po-Hsu Lin <po-hsu.lin at canonical.com>
> ---
>   tools/testing/selftests/net/devlink_port_split.py | 36 +++++++++++++++++++----
>   1 file changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/tools/testing/selftests/net/devlink_port_split.py b/tools/testing/selftests/net/devlink_port_split.py
> index 2b5d6ff..2d84c7a 100755
> --- a/tools/testing/selftests/net/devlink_port_split.py
> +++ b/tools/testing/selftests/net/devlink_port_split.py
> @@ -59,6 +59,8 @@ class devlink_ports(object):
>           assert stderr == ""
>           ports = json.loads(stdout)['port']
>   
> +        validate_devlink_output(ports, 'flavour')
> +
>           for port in ports:
>               if dev in port:
>                   if ports[port]['flavour'] == 'physical':
> @@ -220,6 +222,27 @@ def split_splittable_port(port, k, lanes, dev):
>       unsplit(port.bus_info)
>   
>   
> +def validate_devlink_output(devlink_data, target_property=None):
> +    """
> +    Determine if test should be skipped by checking:
> +      1. devlink_data contains values
> +      2. The target_property exist in devlink_data
> +    """
> +    skip_reason = None
> +    if any(devlink_data.values()):
> +        if target_property:
> +            skip_reason = "{} not found in devlink output, test skipped".format(target_property)
> +            for key in devlink_data:
> +                if target_property in devlink_data[key]:
> +                    skip_reason = None
> +    else:
> +        skip_reason = 'devlink output is empty, test skipped'
> +
> +    if skip_reason:
> +        print(skip_reason)
> +        sys.exit(KSFT_SKIP)
> +
> +
>   def make_parser():
>       parser = argparse.ArgumentParser(description='A test for port splitting.')
>       parser.add_argument('--dev',
> @@ -240,12 +263,9 @@ def main(cmdline=None):
>           stdout, stderr = run_command(cmd)
>           assert stderr == ""
>   
> +        validate_devlink_output(json.loads(stdout))
>           devs = json.loads(stdout)['dev']
> -        if devs:
> -            dev = list(devs.keys())[0]
> -        else:
> -            print("no devlink device was found, test skipped")
> -            sys.exit(KSFT_SKIP)
> +        dev = list(devs.keys())[0]
>   
>       cmd = "devlink dev show %s" % dev
>       stdout, stderr = run_command(cmd)
> @@ -255,6 +275,7 @@ def main(cmdline=None):
>   
>       ports = devlink_ports(dev)
>   
> +    found_max_lanes = False
>       for port in ports.if_names:
>           max_lanes = get_max_lanes(port.name)
>   
> @@ -277,6 +298,11 @@ def main(cmdline=None):
>                   split_splittable_port(port, lane, max_lanes, dev)
>   
>                   lane //= 2
> +        found_max_lanes = True
> +
> +    if not found_max_lanes:
> +        print(f"Test not started, no port of device {dev} reports max_lanes")
> +        sys.exit(KSFT_SKIP)
>   
>   
>   if __name__ == "__main__":
Acked-by: Roxana Nicolescu <roxana.nicolescu at canonical.com>

One remark I have, I assume this has to be applied to jammy, kinetic and 
lunar. I would have put [J,K,L] in the subject, I find it a bit 
confusing the way it is now.

Roxana



More information about the kernel-team mailing list