aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2023-03-21 18:05:30 +0000
committerAlex Bennée <alex.bennee@linaro.org>2023-03-22 15:06:57 +0000
commit9f95111474659aa28ec98a67118ff79bd05cc6e4 (patch)
treed671c4e776aa0a42d5873347aca6637cf7db92e4 /tests
parent80232dba16dc2e52f7b699af5051d100628ba857 (diff)
downloadqemu-9f95111474659aa28ec98a67118ff79bd05cc6e4.zip
qemu-9f95111474659aa28ec98a67118ff79bd05cc6e4.tar.gz
qemu-9f95111474659aa28ec98a67118ff79bd05cc6e4.tar.bz2
tests/avocado: re-factor igb test to avoid timeouts
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>
Diffstat (limited to 'tests')
-rw-r--r--tests/avocado/igb.py38
-rw-r--r--tests/avocado/netdev-ethtool.py116
2 files changed, 116 insertions, 38 deletions
diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py
deleted file mode 100644
index abf5dfa..0000000
--- a/tests/avocado/igb.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-or-later
-# ethtool tests for igb registers, interrupts, etc
-
-from avocado_qemu import LinuxTest
-
-class IGB(LinuxTest):
- """
- :avocado: tags=accel:kvm
- :avocado: tags=arch:x86_64
- :avocado: tags=distro:fedora
- :avocado: tags=distro_version:31
- :avocado: tags=machine:q35
- """
-
- timeout = 180
-
- def test(self):
- self.require_accelerator('kvm')
- kernel_url = self.distro.pxeboot_url + 'vmlinuz'
- kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c'
- kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
- initrd_url = self.distro.pxeboot_url + 'initrd.img'
- initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1'
- initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
-
- # Ideally we want to test MSI as well, but it is blocked by a bug
- # fixed with:
- # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=28e96556baca7056d11d9fb3cdd0aba4483e00d8
- kernel_params = self.distro.default_kernel_params + ' pci=nomsi'
-
- self.vm.add_args('-kernel', kernel_path,
- '-initrd', initrd_path,
- '-append', kernel_params,
- '-accel', 'kvm',
- '-device', 'igb')
- self.launch_and_wait()
- self.ssh_command('dnf -y install ethtool')
- self.ssh_command('ethtool -t eth1 offline')
diff --git a/tests/avocado/netdev-ethtool.py b/tests/avocado/netdev-ethtool.py
new file mode 100644
index 0000000..f7e9464
--- /dev/null
+++ b/tests/avocado/netdev-ethtool.py
@@ -0,0 +1,116 @@
+# 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")