tests/avocado/igb.py | 38 ----------- tests/avocado/netdev-ethtool.py | 116 ++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 38 deletions(-) delete mode 100644 tests/avocado/igb.py create mode 100644 tests/avocado/netdev-ethtool.py
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>
---
v2
- use squashfs instead of largely empty ext4 device
- use read-only cdrom
- don't bother with login favour of direct call from init
- kill VM once test is passed
- add explicit kvm option
- add tags for device type
---
tests/avocado/igb.py | 38 -----------
tests/avocado/netdev-ethtool.py | 116 ++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+), 38 deletions(-)
delete mode 100644 tests/avocado/igb.py
create mode 100644 tests/avocado/netdev-ethtool.py
diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py
deleted file mode 100644
index abf5dfa07f..0000000000
--- 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 0000000000..f7e9464184
--- /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")
--
2.39.2
On 2023/03/22 23:55, Alex Bennée wrote: > 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> > > --- > v2 > - use squashfs instead of largely empty ext4 device > - use read-only cdrom > - don't bother with login favour of direct call from init > - kill VM once test is passed > - add explicit kvm option Why did you add explicit kvm option? Is there something not likely covered with TCG? Regards, Akihiko Odaki > - add tags for device type > --- > tests/avocado/igb.py | 38 ----------- > tests/avocado/netdev-ethtool.py | 116 ++++++++++++++++++++++++++++++++ > 2 files changed, 116 insertions(+), 38 deletions(-) > delete mode 100644 tests/avocado/igb.py > create mode 100644 tests/avocado/netdev-ethtool.py > > diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py > deleted file mode 100644 > index abf5dfa07f..0000000000 > --- 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 0000000000..f7e9464184 > --- /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")
Akihiko Odaki <akihiko.odaki@daynix.com> writes: > On 2023/03/22 23:55, Alex Bennée wrote: >> 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> >> --- >> v2 >> - use squashfs instead of largely empty ext4 device >> - use read-only cdrom >> - don't bother with login favour of direct call from init >> - kill VM once test is passed >> - add explicit kvm option > > Why did you add explicit kvm option? Is there something not likely > covered with TCG? I realised it was the case that the previous igb tested so I added for completeness. What I really wanted to do was to make the test agnostic so it would use KVM when available and fall back to TCG when it couldn't. However my attempt to specify --accel kvm,tcg didn't work. But yes I doubt there is much coverage difference between the two - certainly in the emulation side. > > Regards, > Akihiko Odaki > >> - add tags for device type >> --- >> tests/avocado/igb.py | 38 ----------- >> tests/avocado/netdev-ethtool.py | 116 ++++++++++++++++++++++++++++++++ >> 2 files changed, 116 insertions(+), 38 deletions(-) >> delete mode 100644 tests/avocado/igb.py >> create mode 100644 tests/avocado/netdev-ethtool.py >> diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py >> deleted file mode 100644 >> index abf5dfa07f..0000000000 >> --- 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 0000000000..f7e9464184 >> --- /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") -- Alex Bennée Virtualisation Tech Lead @ Linaro
© 2016 - 2024 Red Hat, Inc.