9f95111474
The core of the test was utilising "ethtool -t eth1 offline" to run through a test sequence. For reasons unknown the test hangs under some configurations of the build on centos8-stream. Fundamentally running the old fedora-31 cloud-init is just too much for something that is directed at testing one device. So we: - replace fedora with a custom kernel + buildroot rootfs - rename the test from IGB to NetDevEthtool - re-factor the common code, add (currently skipped) tests for other devices which support ethtool - remove the KVM limitation as its fast enough to run in KVM or TCG Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Cc: Akihiko Odaki <akihiko.odaki@daynix.com> Message-Id: <20230322145529.4079753-1-alex.bennee@linaro.org>
117 lines
3.7 KiB
Python
117 lines
3.7 KiB
Python
# ethtool tests for emulated network devices
|
|
#
|
|
# This test leverages ethtool's --test sequence to validate network
|
|
# device behaviour.
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-or-late
|
|
|
|
from avocado import skip
|
|
from avocado_qemu import QemuSystemTest
|
|
from avocado_qemu import exec_command, exec_command_and_wait_for_pattern
|
|
from avocado_qemu import wait_for_console_pattern
|
|
|
|
class NetDevEthtool(QemuSystemTest):
|
|
"""
|
|
:avocado: tags=arch:x86_64
|
|
:avocado: tags=machine:q35
|
|
"""
|
|
|
|
# Runs in about 17s under KVM, 19s under TCG, 25s under GCOV
|
|
timeout = 45
|
|
|
|
# Fetch assets from the netdev-ethtool subdir of my shared test
|
|
# images directory on fileserver.linaro.org.
|
|
def get_asset(self, name, sha1):
|
|
base_url = ('https://fileserver.linaro.org/s/'
|
|
'kE4nCFLdQcoBF9t/download?'
|
|
'path=%2Fnetdev-ethtool&files=' )
|
|
url = base_url + name
|
|
# use explicit name rather than failing to neatly parse the
|
|
# URL into a unique one
|
|
return self.fetch_asset(name=name, locations=(url), asset_hash=sha1)
|
|
|
|
def common_test_code(self, netdev, extra_args=None, kvm=False):
|
|
|
|
# This custom kernel has drivers for all the supported network
|
|
# devices we can emulate in QEMU
|
|
kernel = self.get_asset("bzImage",
|
|
"33469d7802732d5815226166581442395cb289e2")
|
|
|
|
rootfs = self.get_asset("rootfs.squashfs",
|
|
"9793cea7021414ae844bda51f558bd6565b50cdc")
|
|
|
|
append = 'printk.time=0 console=ttyS0 '
|
|
append += 'root=/dev/sr0 rootfstype=squashfs '
|
|
|
|
# any additional kernel tweaks for the test
|
|
if extra_args:
|
|
append += extra_args
|
|
|
|
# finally invoke ethtool directly
|
|
append += ' init=/usr/sbin/ethtool -- -t eth1 offline'
|
|
|
|
# add the rootfs via a readonly cdrom image
|
|
drive = f"file={rootfs},if=ide,index=0,media=cdrom"
|
|
|
|
self.vm.add_args('-kernel', kernel,
|
|
'-append', append,
|
|
'-drive', drive,
|
|
'-device', netdev)
|
|
|
|
if kvm:
|
|
self.vm.add_args('-accel', 'kvm')
|
|
|
|
self.vm.set_console(console_index=0)
|
|
self.vm.launch()
|
|
|
|
wait_for_console_pattern(self,
|
|
"The test result is PASS",
|
|
"The test result is FAIL",
|
|
vm=None)
|
|
# no need to gracefully shutdown, just finish
|
|
self.vm.kill()
|
|
|
|
# Skip testing for MSI for now. Allegedly it was fixed by:
|
|
# 28e96556ba (igb: Allocate MSI-X vector when testing)
|
|
# but I'm seeing oops in the kernel
|
|
@skip("Kernel bug with MSI enabled")
|
|
def test_igb(self):
|
|
"""
|
|
:avocado: tags=device:igb
|
|
"""
|
|
self.common_test_code("igb")
|
|
|
|
def test_igb_nomsi(self):
|
|
"""
|
|
:avocado: tags=device:igb
|
|
"""
|
|
self.common_test_code("igb", "pci=nomsi")
|
|
|
|
def test_igb_nomsi_kvm(self):
|
|
"""
|
|
:avocado: tags=device:igb
|
|
"""
|
|
self.require_accelerator('kvm')
|
|
self.common_test_code("igb", "pci=nomsi", True)
|
|
|
|
# It seems the other popular cards we model in QEMU currently fail
|
|
# the pattern test with:
|
|
#
|
|
# pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A
|
|
#
|
|
# So for now we skip them.
|
|
|
|
@skip("Incomplete reg 0x00178 support")
|
|
def test_e1000(self):
|
|
"""
|
|
:avocado: tags=device:e1000
|
|
"""
|
|
self.common_test_code("e1000")
|
|
|
|
@skip("Incomplete reg 0x00178 support")
|
|
def test_i82550(self):
|
|
"""
|
|
:avocado: tags=device:i82550
|
|
"""
|
|
self.common_test_code("i82550")
|